import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型二维数组
*/
public int[][] subsetsWithDup(int[] nums) {
List<List<Integer>> subsets = new ArrayList<>();
Arrays.sort(nums);
backtrack(subsets, new ArrayList<>(), nums, 0);
return convertToArray(subsets);
}
private void backtrack(List<List<Integer>> subsets, List<Integer> currentSubset,
int[] nums, int start) {
// 将当前子集合添加到总集合中
subsets.add(new ArrayList<>(currentSubset));
for (int i = start; i < nums.length; i++) {
// 如果元素与前一个相同,跳过这次循环
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
// 添加到子集合
currentSubset.add(nums[i]);
// 递归寻找下一个数
backtrack(subsets, currentSubset, nums, i + 1);
// 回溯,移除当前节点,生成其他子集合
currentSubset.remove(currentSubset.size() - 1);
}
}
private int[][] convertToArray(List<List<Integer>> subsets) {
int[][] result = new int[subsets.size()][];
for (int i = 0; i < subsets.size(); i++) {
List<Integer> subset = subsets.get(i);
int[] subsetArray = new int[subset.size()];
for (int j = 0; j < subset.size(); j++) {
subsetArray[j] = subset.get(j);
}
result[i] = subsetArray;
}
return result;
}
}
本题知识点分析:
1.递归
2.数组遍历
3.回溯
4.集合存取
5.集合转数组
本题解题思路分析:
1.利用回溯法,如果元素与前一个相同,要进入下一个for循环,避免出现重复子集合
2.递归寻找下一个元素
3.回溯,移除当前元素,就能寻找其他子集合
4.集合转二维数组返回即可
本题使用编程语言: Java
如果你觉得对你有帮助的话,可以点个赞~

京公网安备 11010502036488号