首页 > 其他分享 >《力扣面试150题》题单拓展——回溯

《力扣面试150题》题单拓展——回溯

时间:2023-12-02 16:47:38浏览次数:33  
标签:150 nums int index 力扣 回溯 终止 path 题单

《力扣面试150题》题单拓展——回溯

1.基础知识

void find(string &s, int i, string &path){
    //终止条件
	if(i == s.size()){
        ans.push_back(path);
        return;
    }
    
    for(int k=0; k<index[sub].size(); k++){     //处理一层
        path.push_back(index[sub][k]);
        find(s, i+1, path);						//递归
        path.pop_back();						//回溯的关键
    }
}
//本层的循环处理一层,递归去处理下一层

2.标准回溯

17.电话号码的字母组合

很标注规范的回溯


39.组合总和

每个数字都可以重复用,所以每层递归并不一定都会向下走一位,而是原地位进去,sum是返回条件

for(int index=i; index<9; index++){
    if(sum+nums[index] <= n)			//剪枝
        find(index, ...);

77.组合

把第一层函数当做一层展开,就是用for循环,展开一层遍历,用递归去向下延伸

for(int index=i; index<nums.size(); index++)

这里的终止条件时path收集到了几位


78.子集

当前位要或者不要,这里就没有for循环了,因为直接就可以分为两种情况进行展开了

3.特殊去重

40.组合总和II

终止条件有sum控制,结果集长度不一定相同

if(j-i>0 && nums[j] == nums[j-1])       
//j-i>0 保证了不会和上一层的重复,而且去重的还是本层的   去重本层,但不去重递归的深层
	continue;

216.组合总和III

终止条件有sum和len控制

剪枝+下一位的位数

for(int index=i; index<9; index++){
    if(sum+nums[index] <= n){
        path.push_back(nums[index]);
        find(index+1, n, k, path, len+1, sum+nums[index]);	//递归进入当前遍历位的下一位
        path.pop_back();
    }
}

377.组合总和IV

回溯法翻车了!!!!

优秀评论:转为爬楼梯的问题,每次爬的层数是从nums里面选出来的,太秀了

for(int i=1; i<=target; i++){
    for(auto num:nums){
        if(i >= num)
            dp[i] += (long long)dp[i-num];
    }
}

46.全排列

不重复数组,借助辅助数组来表示是否加入到path中,回溯即可


47.全排列II

全排列,从没选过的里面选一个,结果集长度一定一样,所以终止条件用len判断,去重用bool来判断

回溯时的剪枝很优秀,相比如让每个元素都来i位,更好理解

// 1 1 2 现在需要剪枝同一层的第二个1收集的答案
//当第一个1没有被使用的时候,遍历到第二个1,一定要去重
//如果第一个1现在已经被使用了,那么就可以不再去重,第二个1可以继续使用

if(flag[i] == false)
    if(i>0 && nums[i]==nums[i-1] && flag[i-1] == 0)    //这样可以避免子层的剪枝

90.子集II

这个题值得特殊对待,挑选构成组合问题,不是排列并且没有sum来当做终止条件

因为没有终止条件,每次进入递归都会保存,所以不要把他想象成第i位取不取,而是看做一个集合,从集合里面取不取这个数字加入到结果集合中

void find(vector<int>&nums, int i, vector<int>&path){
    ans.push_back(path);        //这里相当于不要i位,直接先保存
    
    for(int k=i; k<nums.size(); k++){		//这里就是带挑选的集合
        if(k>i && nums[k]==nums[k-1])       
            continue;
        path.push_back(nums[k]);            //这里为要k位,
        find(nums, k+1, path);
        path.pop_back();
    }
}

22.括号生成

根据左右括号的数量,去确定是否参与递归,这题自己思路完美!!

那评论区都在噶什么,那么多动态规划

4.特例

60.排列序列

数学方法更优秀,通过确定首位数字后面一个有多少种可能,来确定首位的数字,以此类推

标签:150,nums,int,index,力扣,回溯,终止,path,题单
From: https://www.cnblogs.com/cyl018/p/17871813.html

相关文章

  • 从 15000 家参赛企业脱颖而出,涛思数据荣获中国创新创业大赛“优秀企业”
    近年来,以大数据、人工智能、物联网、新型显示、高性能集成电路、5G通信、云计算等为代表的创新技术加速突破应用,在传统行业的数字化转型进程中发挥着重要作用,催生出一系列新产品、新技术、新业态,形成了强劲的数字经济发展新动能。在此背景下,2023第十二届中国创新创业大赛新一代信......
  • 《力扣面试150题》题单拓展——滑动窗口
    《力扣面试150题》题单拓展——滑动窗口1.基础知识先区分好,枚举右端点,还是左端点,窗口内的条件改变后,一般都是while控制另一个窗口的移动,然后收集结算我感觉滑动窗口这里变动最大的,什么时候去滑动左窗口,什么时候去收集答案,都很不一样,得慢慢体会滑动窗口难题是真的难,呜呜呜呜......
  • 《力扣面试150题》题单拓展——双指针
    《力扣面试150题》题单拓展——双指针1.基础知识为什么双指针会正确?不会漏掉搜索空间数组nums递增排序,假设共8个元素假设由于搜索空间i<j的限制,只搜索右上角白色倒三角空间,一开始,我们检查右上方单元格(0,7),即计算A[0]+A[7],与target进行比较。如果不相等的话,则要么大......
  • 《力扣面试150题》题单拓展——二分法
    《力扣面试150题》题单拓展——二分法困难题:找第K大/小1.基础知识首先可以确定答案的上下界单调性分析:如果当前答案为m时,可以满足,一定有一侧是一定满足的,另一侧不一定,需要去探索boolis_ok(){}intl,r;intans;while(l<=r){intm=l+((r-l)>>1);......
  • 《力扣面试150题》题单拓展——堆
    《力扣面试150题》题单拓展——堆一、堆困难题:找K小,先考虑二分法基础知识//优先队列:priority_queue<int,vector<int>,greater<int>>q;//小根堆priority_queue<int,vector<int>,less<int>>q;//小根堆优先队列自定义比较函数//1,小根堆boolcmp(vector<i......
  • 力扣907. 子数组的最小值之和(单调栈)
    给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。由于答案可能很大,因此 返回答案模 10^9+7 。 示例1:输入:arr=[3,1,2,4]输出:17解释:子数组为[3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。最小值为3,1,2,4,1,1,2,1,1,1,和......
  • 从 15000 家参赛企业脱颖而出,涛思数据荣获中国创新创业大赛“优秀企业”
    近年来,以大数据、人工智能、物联网、新型显示、高性能集成电路、5G通信、云计算等为代表的创新技术加速突破应用,在传统行业的数字化转型进程中发挥着重要作用,催生出一系列新产品、新技术、新业态,形成了强劲的数字经济发展新动能。在此背景下,2023第十二届中国创新创业大赛新一代信......
  • ACM中的组合计数题单好题汇总(持续更新中)
    前言:这里会分享一些精妙的组合计数题,此类题往往需要选择合适的计数集合的划分方式,有些计数角度的精妙,个人感觉没有做过相对的题目,或者是计数感足够犀利,实在是很难想到正确的角度,所以这里会汇总一些有趣的计数题,希望可以帮助到一部分人ARC168C-SwapCharacte......
  • [Codeforces] CF1506C Epic Transformation
    EpicTransformation-洛谷算是今天的题目里边思维难度最高的一道了,但是代码真的简单的要死题意你有一个长度为 \(n\) 的序列 \(a\),你可以对其进行下列操作:选择 \(i,j\) 满足 \(*a_i\neqa_j*\) 然后删除 \(*a_i,a_j*\) 两个数。求序列 a 经过若干次操作后最少......
  • Oracle DBA遇到的top150个问题
    作为OracleDBA(数据库管理员),以下是更多常见的Oracle数据库管理中可能遇到的150个问题案例:数据库备份和恢复失败数据库性能下降数据库连接问题长时间运行的查询和死锁数据库服务器崩溃或宕机数据库空间不足数据库日志文件过大数据库表空间损坏数据库安全漏洞数据库版本升......