7.9子集②(LC90-M)

7.9子集②(LC90-M)_第1张图片

算法:

这道题目和78.子集 (opens new window)区别就是集合里有重复元素了

78题中的提示明确说明了“nums 中的所有元素 互不相同

而90题中的元素可能重复

本题的关键在于去重!

怎么去重?

类似7.5组合总和②(LC40-M)-CSDN博客

去重的关键就是先排序,让重复的元素都在一起

if (i > startIndex && nums[i] == nums[i - 1] ) {
	continue;
}

去重就是在78题代码的基础上加了个排序、去重

正确代码:

class Solution {
    //输出为二维数组,需要两个全局变量
    List> result = new LinkedList<>();
    List path = new LinkedList<>();
    public List> subsetsWithDup(int[] nums) {
    //排序!
    Arrays.sort(nums);

    backtracking (nums,0);
    return result;

    }
    void backtracking (int[] nums, int startindex) {
    //每次递归时收集path
    result.add(new LinkedList(path));
    //确定终止条件,直接返回;
    //这里不收集结果了,结果在单层递归时一个一个收集
    if (startindex >= nums.length) {
        return;
    }
    //单层递归
    for (int i = startindex; i < nums.length; i++) {
    //去重,注意条件nums[i] == nums[i-1],而不是nums[i] == nums[i+1]
    //因为当前nums[i]应该和前一个值比较,而不是和后一个比
    //i > startindex要写在前面,要不然判断nums[i] == nums[i-1]时,会报错
        if ( i > startindex && nums[i] == nums[i-1]) continue;
        path.add(nums[i]);
        backtracking (nums, i+1);
        path.removeLast();
    }
    } 
}

注意:

1.排序的代码:

    Arrays.sort(nums);

2.去重的代码:

 if ( i > startindex && nums[i] == nums[i-1]) continue;

   (1)注意条件nums[i] == nums[i-1],而不是nums[i] == nums[i+1],因为当前nums[i]应该和前一个值比较,而不是和后一个比

    (2)i > startindex要写在前面,要不然判断nums[i] == nums[i-1]时,会报错。

时间空间复杂度:

7.9子集②(LC90-M)_第2张图片

你可能感兴趣的:(#,7.回溯,数据结构)