トピック:
繰り返される要素を含む可能性のある整数配列numsを指定すると、配列のすべての可能なサブセット(べき集合)を返します。
注:ソリューションセットに重複するサブセットを含めることはできません。
分析:
参照:サブセットを
変更しましょうI:最初に配列を並べ替え、
次に再帰ループで、現在の番号が前の番号と同じかどうかを判断し、同じ場合はスキップします。
つまり、[1,2,2,2]の場合、0添え字[1]と1添え字[2]の再帰ループのみが実行され、3添え字以降は直接スキップされます。
コード:
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums); //排序
getAns(nums, 0, new ArrayList<>(), ans);
return ans;
}
private void getAns(int[] nums, int start, ArrayList<Integer> temp, List<List<Integer>> ans) {
ans.add(new ArrayList<>(temp));
for (int i = start; i < nums.length; i++) {
//和上个数字相等就跳过
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
temp.add(nums[i]);
getAns(nums, i + 1, temp, ans);
temp.remove(temp.size() - 1);
}
}
}