• Leetcode 90. 子集 II dfs


    地址 https://leetcode-cn.com/problems/subsets-ii/

    给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
    解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
    
    示例 1:
    输入:nums = [1,2,2]
    输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
    
    示例 2:
    输入:nums = [0]
    输出:[[],[0]]
    
    提示:
    1 <= nums.length <= 10
    -10 <= nums[i] <= 10
    

    解答
    对于每个元素 我们有选择或者不选择的方案。
    但是需要避免重复的选择 比如对于1 2 2 ,第一个2不选择和第二个2不选择 得到的结果都是 [1,2]
    要避免重复的方案就是 一旦不选择2 后面的2 都不必选择。
    所以我们还需要将nums进行排序,这样更加方便执行一旦不选择某个数后面相同的数都不选择

    class Solution {
    public:
    	vector<vector<int>> ans;
    	void dfs(int idx, vector<int>& v, const vector<int>& nums) {
    		if (idx >= nums.size()) {
    			ans.push_back(v);
    			return;
    		}
    
    		v.push_back(nums[idx]);
    		dfs(idx + 1, v, nums);
    		v.pop_back();
    
    		//当前元素不选择 
    		//为避免重复 后面相同元素均不选择
    		int val = nums[idx];
    		while (idx < nums.size() && nums[idx] == val) { idx++; }
    		dfs(idx , v, nums); 
    	}
    
    	vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            sort(nums.begin(),nums.end());
    		vector<int> v;
    		dfs(0, v, nums);
    		return ans;
    	}
    };
    

    我的视频题解空间

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Solr7.7安装,配置中文分词 IKAnalyzer分词
    Solr7.7安装,链接数据库并导入数据,初级导入数据
    Solr7.7安装,过浏览器可以看到Solr界面,进行可视化操作
    Solr7.7安装,JDK安装
    Jquery 全局错误处理
    各种问题
    Elmah 数据库脚本
    LINQ&EF任我行(二)--LinQ to Object
    css3 animatehue属性
    Lync二次开发关于Lync启动退出问题
  • 原文地址:https://www.cnblogs.com/itdef/p/14800064.html
Copyright © 2020-2023  润新知