题解 | #牛牛的幂集#
牛牛的幂集
https://www.nowcoder.com/practice/7a7fcee941e648659c67d931857c1d9e?tpId=363&tqId=10618319&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj
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
如果你觉得对你有帮助的话,可以点个赞~