本文介绍: 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复子集返回的解集中,子集可以按 任意顺序 排列


90. 子集 II:

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复子集返回的解集中,子集可以任意顺序 排列

样例 1:

输入nums = [1,2,2]
	
输出:
	
	[[],[1],[1,2],[1,2,2],[2],[2,2]]

样例 2:

输入nums = [0]
	
输出:
	
	[[],[0]]

提示


分析


题解

rust

impl Solution {
    pub fn subsets_with_dup(nums: Vec&lt;i32&gt;) -&gt; Vec&lt;Vec<i32&gt;&gt; {
        let mut ans = Vec::new();

        let mut nums = nums;

        // 排序
        nums.sort();

        let n = nums.len();

        // 每一个数都有选择和不选2种情况,穷举所有可能
        (0..(1 << n)).for_each(|mask| {
            let mut row = Vec::new();
            let mut flag = true;
            for i in 0..n {
                if (mask &amp; (1 << i)) != 0 {
                    if i &gt; 0 &amp;&amp; nums[i] == nums[i - 1] &amp;&amp; (mask &amp; (1 << (i - 1))) == 0 {
                        // 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个分支发生重复)
                        flag = false;
                        break;
                    }
                    row.push(nums[i]);
                }
            }
            if flag {
                ans.push(row);
            }
        });

        return ans;
    }
}

go

func subsetsWithDup(nums []int) [][]int {
    var ans [][]int
	// 排序
	sort.Ints(nums)
	n := len(nums)

outer:
	// 每一个数都有选择和不选2种情况,穷举所有可能
	for mask := 0; mask < (1 << n); mask++ {
		var row []int
		for i, v := range nums {
			if mask&amp;(1<<i) &gt; 0 {
				// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
				if i &gt; 0 &amp;&amp; v == nums[i-1] &amp;&amp; (mask&amp;(1<<(i-1))) == 0 {
					continue outer
				}
				row = append(row, v)
			}
		}
		ans = append(ans, row)
	}

	return ans
}

c++:

class Solution {
public:
    vector<vector<int&gt;> subsetsWithDup(vector<int>&amp; nums) {
        vector<vector<int>> ans;
        // 排序
        sort(nums.begin(), nums.end());
        int n = nums.size();

        // 每一个数都有选择和不选2种情况,穷举所有可能
        for (int mask = 0; mask < (1 << n); ++mask) {
            vector<int> row;
            bool flag = true;
            for (int i = 0; i < n; ++i) {
                if (mask &amp; (1 << i)) {
                    // 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
                    if (i > 0 &amp;&amp; nums[i] == nums[i - 1] && (mask & (1 << (i - 1))) == 0) {
                        flag = false;
                        break;
                    }
                    row.emplace_back(nums[i]);
                }
            }
            if (flag) {
                ans.emplace_back(row);
            }
        }

        return ans;
    }
};

python

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        ans = []
        # 排序
        nums.sort()
        n = len(nums)
        # 每一个数都有选择和不选2种情况,穷举所有可能
        for mask in range(1 << n):
            flag = True
            row = []
            for i in range(n):
                if mask & (1 << i):
                    # 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
                    if i > 0 and nums[i] == nums[i - 1] and (mask & (1 << (i - 1))) == 0:
                        flag = False
                        break
                    row.append(nums[i])
            if flag:
                ans.append(row)
        return ans


java

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        final List<List<Integer>> ans = new ArrayList<>();
        // 排序
        Arrays.sort(nums);
        final int n = nums.length;
        // 每一个数都有选择和不选2种情况,穷举所有可能
        for (int mask = 0; mask < (1 << n); ++mask) {
            final List<Integer> row  = new ArrayList<>();
            boolean             flag = true;
            for (int i = 0; i < n; ++i) {
                if ((mask & (1 << i)) != 0) {
                    // 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
                    if (i > 0 && nums[i] == nums[i - 1] && (mask & (1 << (i - 1))) == 0) {
                        flag = false;
                        break;
                    }
                    row.add(nums[i]);
                }
            }
            if (flag) {
                ans.add(row);
            }
        }
        return ans;
    }
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


原文地址:https://blog.csdn.net/leyi520/article/details/134640114

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_15411.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注