这题非常复杂。牛客网上对应的题目对结果要求比较苛刻,所以要调整。
整体思路是:先放进去一个,然后第二个来的时候插入到已有的,并且把自己也放进去。
public static ArrayList<ArrayList<Integer>> getSubsets(int[] a, int n){ ArrayList<ArrayList<Integer>> res = new ArrayList(); if(n <= 0) return res; ArrayList<Integer> tmp = new ArrayList(); tmp.add(a[n-1]); res.add(tmp); for(int i = n-2; i >=0; i--){ ArrayList<ArrayList<Integer>> res2 = new ArrayList(res); for(ArrayList<Integer> list : res){ ArrayList<Integer> list2 = new ArrayList(list); list2.add(a[i]); res2.add(list2); } ArrayList<Integer> list3 = new ArrayList(); list3.add(a[i]); res2.add(list3); res = new ArrayList(res2); } ArrayList<ArrayList<Integer>> res3 = new ArrayList(); ArrayList<Integer> max = new ArrayList(); int flag = 0; int h = res.size(); while(res3.size() != h){ max = res.get(0); for(int i = 1; i < res.size(); i++){ if(big(res.get(i),res.get(flag))){ max = res.get(i); flag = i; } } ArrayList<Integer> list4 = new ArrayList(max); res3.add(list4); res.remove(flag); flag = 0; } return res3; } public static boolean big(ArrayList<Integer> list1, ArrayList<Integer> list2){ for(int i = 0; i < list1.size() && i<list2.size(); i++){ if(list1.get(i) > list2.get(i)){ return true; } else if(list1.get(i) < list2.get(i)){ return false; } else{ } } if(list1.size() > list2.size()) return true; else{ return false; } }