题解 | #集合的所有子集(一)#

集合的所有子集(一)

http://www.nowcoder.com/practice/c333d551eb6243e0b4d92e37a06fbfc9

import java.util.*;

public class Solution {
    
    public class ComparaInteger implements Comparator<Integer> {
        @Override
        public int compare(Integer num1, Integer num2) {
            return num1 - num2;
        }
    }
    
    public class ComparaArrayList implements Comparator<ArrayList<Integer>> {
        @Override
        public int compare(ArrayList<Integer> arr1, ArrayList<Integer> arr2) {
            int len1 = arr1.size();
            int len2 = arr2.size();
            int p1 = 0;
            int p2 = 0;
            while (p1 < len1 && p2 < len2) {
                if (arr1.get(p1) < arr2.get(p2)) {
                    return -1;
                }
                else if (arr1.get(p1) > arr2.get(p2)) {
                    return 1;
                }
                else {
                    p1++;
                    p2++;
                }
            }
            if (len1 < len2) {
                return -1;
            }
            else if (len1 > len2) {
                return 1;
            }
            else {
                return 0;
            }
        }
    }
    
    ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
    int len = 0;
    
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        
        len = S.length; // 获取数组 S 的长度
        
        // 一些特殊情况的处理
        if (0 == len) {
            return arrayList;
        }
        
        ArrayList<Integer> tmpArrayList = new ArrayList<>();
        process(S, 0, tmpArrayList);
        // 不好意思,看错了,题目没有要求最终的结果集需要排序
        // 在返回最终的结果集之前,需要对结果集进行排序
        // arrayList.sort(new ComparaArrayList());
        return arrayList;
    }
    
    public void process(int[] S, int start, ArrayList<Integer> tmpArrayList) {
        
        // 什么都不要想,一上来就直接将当前已经得到的子集,添加到结果集当中去
        // 复制一份 tmpArrayList
        ArrayList<Integer> addArrayList = new ArrayList<>();
        addArrayList.addAll(tmpArrayList);
        // 对 addArrayList 进行排序
        addArrayList.sort(new ComparaInteger());
        // 将子集添加到结果集当中去
        arrayList.add(addArrayList);
        
        if (start >= len) { // 此时 S 中没有可供我们选择的数字了
            return;
        }
        
        for (int i = start; i < len; i++) {
            tmpArrayList.add(S[i]); // 从数组 S 中获取一个数字,添加到当前的子集中去
            process(S, i + 1, tmpArrayList);
            tmpArrayList.remove(tmpArrayList.size() - 1); // 回溯
        }
        return;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
443839次浏览 4528人参与
# 春招别灰心,我们一人来一句鼓励 #
42377次浏览 539人参与
# 阿里云管培生offer #
120553次浏览 2223人参与
# 地方国企笔面经互助 #
7994次浏览 18人参与
# 同bg的你秋招战况如何? #
77468次浏览 569人参与
# 实习必须要去大厂吗? #
55834次浏览 961人参与
# 北方华创开奖 #
107514次浏览 600人参与
# 虾皮求职进展汇总 #
116677次浏览 889人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11755次浏览 294人参与
# 实习,投递多份简历没人回复怎么办 #
2455156次浏览 34862人参与
# 提前批简历挂麻了怎么办 #
149980次浏览 1979人参与
# 在找工作求抱抱 #
906171次浏览 9423人参与
# 如果公司给你放一天假,你会怎么度过? #
4769次浏览 56人参与
# 你投递的公司有几家约面了? #
33212次浏览 188人参与
# 投递实习岗位前的准备 #
1196109次浏览 18551人参与
# 机械人春招想让哪家公司来捞你? #
157654次浏览 2267人参与
# 双非本科求职如何逆袭 #
662449次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12818次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35996次浏览 384人参与
# 简历中的项目经历要怎么写? #
86964次浏览 1517人参与
# 参加完秋招的机械人,还参加春招吗? #
20161次浏览 240人参与
# 我的上岸简历长这样 #
452091次浏览 8089人参与
牛客网
牛客企业服务