zoukankan      html  css  js  c++  java
  • LeetCode90.子集 ||

    题目

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

    分析

    在LeetCode78.子集基础上的变形,解题思路来源 LeetCode40.组合总和II,这两个题目的核心就是,给定可能包含重复元素的集合,如何将结果去重?利用 used数组 +排序(勿忘)

    在搜索树中同分支可以有重复,但同层不能有重复。因为同层出现重复,意味着结果可能会有重复。新开一个数组 used ,来标记元素使用情况。nums[i] == nums[i-1] 的情况下,如果 used[i - 1] == true , 说明同一树支上有重复使用。如果 used[i - 1] == false,说明同层出现重复,这种情况要不做操作,因为之前已经处理过该元素。

    代码

     1 class Solution {
     2 public:
     3     vector<int>path;
     4     vector<vector<int>>res;
     5     void backtracking(vector<int>nums,int startIndex,vector<bool>used){
     6         res.push_back(path);
     7         if(startIndex == nums.size()){
     8             return;
     9         }
    10         for(int i = startIndex;i < nums.size();i++){
    11             if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false) continue;
    12             used[i] = true;
    13             path.push_back(nums[i]);
    14             backtracking(nums,i+1,used);
    15             path.pop_back();
    16             used[i] =false;
    17         }
    18     }
    19     vector<vector<int>> subsetsWithDup(vector<int>& nums) {
    20         sort(nums.begin(),nums.end());  //先排序,让重复元素挨在一起
    21         vector<bool>used(nums.size(),false);
    22         backtracking(nums,0,used);
    23         return res;
    24     }
    25 };
  • 相关阅读:
    Linux监控和安全运维 2.0 zabbix配置邮件告警
    Linux监控和安全运维 1.9 zabbix增加客户端监控
    linux系统构架
    给虚拟机添加eth1网络适配器(网卡)
    linux系统构架
    linux系统构架
    Linux系统构架
    VIM-Sed常用的一些记录。。。逐渐学习。。
    AIX用chsec命令修改快捷修改配置文件
    SYSLOG审记日志的配置。
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14357944.html
Copyright © 2011-2022 走看看