求一個數組的全部子集的兩種解法
阿新 • • 發佈:2019-01-09
一個常見的情景是羅列出[1,2,5,8]的全部子集,結果如下[],[1],[2],[5],[8],[1,2].................
結果有很多,這中解法的題型非常的多,
那麼第一種解法就是利用遞迴,壓棧處棧
基本思想就是,1,2,5,83為一組
12 15 18 25 28為一組
125 128 258為一組
1258為一組
也就是說固定前面的數字 依次切換
程式碼如下:
public class CCCC { private static List<Integer> stack1=new ArrayList<Integer>(); private static int[] savenumber=null; private static List<String> jieguo=new ArrayList<String>(); public static void di(int index, int ce ,int start) { for(int i=start;i<savenumber.length;i++) { stack1.add(i); if(ce==index) { yan(); }else{ di(index,ce+1, i+1); } stack1.remove(stack1.size()-1); } } public static boolean yan() { String he=""; for(int i=stack1.size()-1;i>=0;i--) { he+=savenumber[stack1.get(i)]+","; } jieguo.add(he); return true; } public static int getSum(int[] xx){ int sum=0; for(int i=0;i<xx.length;i++){ sum+=xx[i]; } return sum; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner=new Scanner(System.in); while(scanner.hasNextInt()){ Integer num= scanner.nextInt(); savenumber=new int[num]; for(int i=0;i<num;i++) { savenumber[i]=scanner.nextInt(); } for(int ceng=1;ceng<=num;ceng++) { di(ceng,1,0); } System.out.println(jieguo.toString()); } }
第二種演算法,利用二進位制的思想 如 0110 1001 0001
加入陣列為[1,2,5,8] 0110 就代表[ 2,5] 1001 代表[ 1,8] 0表示該陣列位置不選,1表示選中
程式碼如下
z
public class SSSS { static int n; static List<String> list=new ArrayList<String>(); public static void get(int x,int[] mm){ String sum=""; String m=getBinaryValue(x); char[] data=m.toCharArray(); for (int i = 0; i < data.length; i++) { if(data[i]=='1'){ sum+=mm[i]; } } if(!sum.equals("")) list.add(sum); } public static String getBinaryValue(int x) { StringBuffer sb = new StringBuffer(Integer.toBinaryString(x)); int length = sb.length(); for(int j=0;j<n-length;j++){ sb.insert(0, "0"); } return sb.toString(); } public static int getSum(int[] xx){ int sum=0; for(int i=0;i<xx.length;i++){ sum+=xx[i]; } return sum; } public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNextInt()){ int[] mm; n=in.nextInt() ;//注意while處理多個case mm=new int[n]; for(int i=0;i<n;i++){ mm[i]=in.nextInt() ; } for (int i = 0; i < Math.pow(2, n)-1; i++) { get(i, mm); } System.out.println(list.toString()); } }
當我們得到所以集合時,問題將迎刃而解,
不僅僅陣列可以這麼做,字串也可以,當我們學習一種演算法,要掌握它的思想,做到舉一反三