题解 | #牛牛的幂集#

牛牛的幂集

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

如果你觉得对你有帮助的话,可以点个赞~

全部评论

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务