zoukankan      html  css  js  c++  java
  • 【LeetCode-回溯】子集 II

    题目描述

    给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
    说明:解集不能包含重复的子集。
    示例:

    输入: [1,2,2]
    输出:
    [
      [2],
      [1],
      [1,2,2],
      [2,2],
      [1,2],
      []
    ]
    

    题目链接: https://leetcode-cn.com/problems/subsets-ii/
    做这题之前可以先做一下子集.

    思路

    子集这题基本是一样的,这是这题数组中可能包含重复元素,所以比“子集”那题多了去重操作。去重的方法是:在同一次循环下不能出现相同的元素。代码如下:

    class Solution {
    public:
        vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            if(nums.empty()) return {{}};
    
            vector<vector<int>> ans;
            vector<int> track;
            sort(nums.begin(), nums.end()); // 排序帮助去重
            backtrack(nums, 0, track, ans);
            return ans;
        }
    
        void backtrack(vector<int> nums, int start, vector<int> track, vector<vector<int>>& ans){
            ans.push_back(track);
    
            for(int i=start; i<nums.size(); i++){
                if(i>start && nums[i]==nums[i-1]) continue; // 去重
                track.push_back(nums[i]);
                backtrack(nums, i+1, track, ans);
                track.pop_back();
            }
        }
    };
    
    • 时间复杂度:O(n*2^n)
    • 空间复杂度:O(n*2^n)
  • 相关阅读:
    构造函数+this关键字+super关键字
    封装
    数组+方法
    流程控制语句
    java运算符+引用数据类型
    java的基础安装
    mysql数据库连接
    mysql数据库约束
    mysql数据库
    练习010:按奇偶排序数组
  • 原文地址:https://www.cnblogs.com/flix/p/12770371.html
Copyright © 2011-2022 走看看