9.4---集合子集(CC150)

这题非常复杂。牛客网上对应的题目对结果要求比较苛刻,所以要调整。

整体思路是:先放进去一个,然后第二个来的时候插入到已有的,并且把自己也放进去。

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;
        }
    }

 

posted @ 2015-12-29 18:56  创业-李春跃-增长黑客  阅读(158)  评论(0编辑  收藏  举报