给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
输入: nums = [1,2,2] 输出: [[],[1],[1,2],[1,2,2],[2],[2,2]]
输入: nums = [0] 输出: [[],[0]]
impl Solution {
pub fn subsets_with_dup(nums: Vec) -> Vec> {
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 & (1 << i)) != 0 {
if i > 0 && nums[i] == nums[i - 1] && (mask & (1 << (i - 1))) == 0 {
// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
flag = false;
break;
}
row.push(nums[i]);
}
}
if flag {
ans.push(row);
}
});
return ans;
}
}
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&(1< 0 {
// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
if i > 0 && v == nums[i-1] && (mask&(1<<(i-1))) == 0 {
continue outer
}
row = append(row, v)
}
}
ans = append(ans, row)
}
return ans
}
class Solution {
public:
vector> subsetsWithDup(vector& nums) {
vector> ans;
// 排序
sort(nums.begin(), nums.end());
int n = nums.size();
// 每一个数都有选择和不选2种情况,穷举所有可能
for (int mask = 0; mask < (1 << n); ++mask) {
vector row;
bool flag = true;
for (int i = 0; i < n; ++i) {
if (mask & (1 << i)) {
// 配合排序去重(上一个数没选,这一个也不选,否则就和之前选择上一个的分支发生重复)
if (i > 0 && 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;
}
};
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
class Solution {
public List> subsetsWithDup(int[] nums) {
final List> ans = new ArrayList<>();
// 排序
Arrays.sort(nums);
final int n = nums.length;
// 每一个数都有选择和不选2种情况,穷举所有可能
for (int mask = 0; mask < (1 << n); ++mask) {
final List 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/ 博客原创~