给你一个整数数组 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/ 博客原创~