首页 > 其他分享 >【力扣】子集II(回溯法)(排序函数的一种隐藏用法?)

【力扣】子集II(回溯法)(排序函数的一种隐藏用法?)

时间:2024-03-09 15:24:48浏览次数:17  
标签:力扣 nums int res II startindex vector 回溯 path

题目描述

image
可以套回溯模版的题,但是在写的过程中发现,如果数组中有多个相同元素分散存在的话,就会有一些子集无法得到
image
像这里的1,4,4,如果对数组从左到右枚举的话是无论如何都得不到的。
对这样的数组使用排序函数后,造成的效果就是相同的元素都堆在了一起,这样就能正确地得到所有子集。

class Solution {
public:
vector<vector<int>> res;
vector<int> path;
bool occured(vector<int>& nums, int key, int startindex){
    for(int i = startindex; i < key; i++){
        if(nums[key] == nums[i]){
            return true;
        }
    }
    return false;
}
void backtrace(vector<int>& nums, int startindex,int length){
    if(path.size() == length){
        res.push_back(path);
    }
    if(length > nums.size()){
        return ;
    }

    for(int i = startindex; i < nums.size(); i++){
        if(i != startindex && occured(nums, i,startindex)){
            continue;
        }else{
            path.push_back(nums[i]);
            backtrace(nums, i + 1, length + 1);
            path.pop_back();
        }
    }
}
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        res.clear();
        sort(nums.begin(), nums.end());
        backtrace(nums, 0, 0);
        return res;
    }
};

标签:力扣,nums,int,res,II,startindex,vector,回溯,path
From: https://www.cnblogs.com/satsuki26681534/p/18062740

相关文章

  • 【力扣】复原IP地址(回溯法)(分割问题)
    问题描述在这个题中,因为结果的数据类型为vector<string>所以直接在s中添加分割点比较方便,先看一下代码:classSolution{private:vector<string>result;//记录结果//startIndex:搜索的起始位置,pointNum:添加逗点的数量voidbacktracking(string&s,intst......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点
    24.两两交换链表中的节点https://leetcode.cn/problems/swap-nodes-in-pairs/description/publicListNodeswapPairs(ListNodehead){if(head==null||head.next==null)returnhead;ListNoderes=head.next;ListNodepre=newListNod......
  • 40. 组合总和 IIc
    很好的题目,使我的大脑旋转。/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/intte......
  • STM32硬件IIC使用
    概述虽然STM32的硬件IIC据说有设计缺陷,但是经过我的实践,至少STM32F103的硬件IIC是没问题的。这里给出STM32的硬件IIC的使用以及编程思路。1.STM32硬件IIC引脚在这里给出STM32F103的硬件IIC引脚,方便查阅使用2.STM32硬件IIC使用流程STM32的硬件IIC我认为是非常具有借鉴意义的,......
  • 力扣回溯之 39. 组合总和
    //剪枝优化classSolution{  publicList<List<Integer>>combinationSum(int[]candidates,inttarget){    List<List<Integer>>res=newArrayList<>();    List<Integer>path=newArrayList<>();    A......
  • 【力扣】组合总和3(组合的去重)
    问题描述注意,如果数组里有两个元素的值相同,那么这两个元素是可以出现在同一个组合里的:但是:如果按前面的思路分析的话,会发现结果中出现很多相同的组合。像这样:这很明显是由于两个相同的1造成的,因为当前的startindex对应第一个1时,向下一层递归后,starindex定位的还是1,。如......
  • 216. 组合总和 IIIc
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/inttemp[10];voiddfs(int**......
  • 【力扣】组合总数(回溯法)
    题目描述#include<iostream>#include<vector>usingnamespacestd;vector<vector<int>>res;vector<int>path;intaccumulate(vector<int>path){ intsum; for(inti=0;i<path.size();i++){ sum+=path[i]; } r......
  • 代码随想录算法训练营第三十九天|● 62.不同路径 ● 63. 不同路径 II
    不同路径 题目链接:62.不同路径-力扣(LeetCode)思路:由于不能回退,因此每一格只能来自上一格或左边一格,因此dp数组中每个格子只要将这两个格子的值相加即可。classSolution{public:intuniquePaths(intm,intn){vector<vector<int>>dp(m,vector<int>(n));......
  • 如何配置云服务器IIS
    一:云服务系统配置 二:点击开始菜单,找到服务器管理器,进入后,点击管理菜单中的添加角色和功能。三:随后进入到安装向导,安装类型默认选择项。 四:服务器选择中一般只会有一台服务器,也就是本机。 五:然后进入到下一步,服务器角色按下图中的选择项进行选择。 六:全部勾选......