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

集合的所有子集(二)

https://www.nowcoder.com/practice/a3dfd4bc8ae74fad9bc65d5ced7ae813

注意结果要求去重,并且有序

所以,首先进行排序,这样可以保证结果有序,以及方便进行使用数组进行去重。

为了获取所有的子集,需要进行获取对数组的遍历过程,则在递归开始,将当前已经遍历的路径,存储进入结果集中。

注意这里的去重,不是单个路径中进行去重,而是避免不同路径的相同位置出现相同的元素。那为了进行同层去重,使用used数组标记当前元素的状态

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型二维数组
     */
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
  	// 进行去重,标记是否已被使用
    int[] used;

    public ArrayList<ArrayList<Integer>> subsets (int[] nums) {
        Arrays.sort(nums);
        used = new int[nums.length];
        getSubSet(nums, 0);
        return res;
    }

    public void getSubSet(int[] nums, int startIndex) {

        res.add(new ArrayList<>(path));

        if (startIndex == nums.length) {
            return;
        }

        for (int i = startIndex; i < nums.length; ++i) {
		  // 如果前一个元素的使用状态为0,说明 当前位置,这个元素已经出现过了。
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) {
                continue;
            }
            path.add(nums[i]);
            used[i] = 1;
            getSubSet(nums, i + 1);
            path.removeLast();
            used[i] = 0;
        }
    }
}

全部评论

相关推荐

敢逐云霄志:你打招呼语怎么能这么长,hr都没看下去的欲望,简明扼要说重点,就读于某某学校某某专业,26届应届毕业生,学信网可查,先后在某某公司实习过(如有),然后做过什么项目,想找一份什么样的工作,可实习几个月以上,期待您的回复。
点赞 评论 收藏
分享
安静的鲸鱼offer...:神仙级别hr,可遇不可求,甚至他可能也是突然有感而发。只能说遇上是件幸事。
秋招开始捡漏了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务