leetcode 77. 组合 思考分析

目录

    • 1、题目
    • 2、回溯法思路
    • 3、参考其他思路,更深入了解这个问题
    • 4、剪枝优化

可能需要回顾到的知识文章:
1、常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)
2、回溯法初步
删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法

1、题目

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
在这里插入图片描述

2、回溯法思路

集合元素个数为n,由此可以看出解空间树每个结点有n孩子,深度为k。
利用模板,就就就AC了。。。
每次确定一个起点和一个终点,从start遍历到end(对于本层元素而言)。
将第i个元素放入res中,然后进入下一层,下一层的起点是i+1(这样start只会一直向大的数值延伸,不会产生重复的元素)。
如果不符合就把这个元素pop掉。

class Solution {
public:vector<vector<int>> result;vector<int> res;void backtracking(int start,int end,int k){//找到了k个数if(res.size() == k){result.push_back(res);return;}for(int i=start;i<=end;i++){//处理结点;res.push_back(i);//递归,探索下一层backtracking(i+1,end,k);		//递归//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combine(int n, int k) {result.clear();res.clear();backtracking(1,n,k);return result;}
};

3、参考其他思路,更深入了解这个问题

对于较小的k,我们可以很容易想到for循环嵌套k层解决,如下:
n=4,k=2;

int n = 4;
for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {cout << i << " " << j << endl;}
}

但是对于较大的k,我们的显然不能写嵌套for。例如要解决n=100.k=50的情况,暴力写法需要嵌套50层for循环,而回溯法就是利用递归来解决嵌套层数的问题。
每一层递归中嵌套一个for循环,那么递归就可以用于解决多层嵌套循环的问题了。
观察我们的解空间树:
在这里插入图片描述
每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。
n相当于树的宽度,k相当于树的深度。

4、剪枝优化

下面的遍历范围是可以剪枝优化的:

for(int i=start;i<=end;i++)
{//处理结点;res.push_back(i);//递归,探索下一层backtracking(i+1,end,k);		//递归//回溯,撤销处理结果res.pop_back();
}

举例n=4,k=4时,那么第一层for循环的时候,从元素2开始的遍历就已经没有意义了,因为遍历了也凑不到4个元素了。
所以我们可以剪枝的地方就是每一层的end。
我们已经选择的元素个数为:res.size()
我们还需要的元素的个数为k-res.size()
所以最多从end-(k-res.size())+1的地方开始遍历。
所以可以修改为:

for(int i=start;i<=end-(k-res.size())+1;i++)
{//处理结点;res.push_back(i);//递归,探索下一层backtracking(i+1,end,k);		//递归//回溯,撤销处理结果res.pop_back();
}

完整代码:

class Solution {
public:vector<vector<int>> result;vector<int> res;void backtracking(int start,int end,int k){//找到了k个数if(res.size() == k){result.push_back(res);return;}for(int i=start;i<=end-(k-res.size())+1;i++){//处理结点;res.push_back(i);//递归,探索下一层backtracking(i+1,end,k);		//递归//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combine(int n, int k) {result.clear();res.clear();backtracking(1,n,k);return result;}
};

可以看到速度是有明显的提升的:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP 调用dll(VB)及封装dll实例

ASP调用dll及封装dll实例&#xff0c;封装为dll可以提供运行效率&#xff0c;加密代码。 打开VB6&#xff0c;新建ActiveX DLL 2、在工程引用中加入Microsoft Active Server Pages Object Library选择 3、填加代码如下Code Start 声明部分 Private MyScriptingContext As Scrip…

三、全景拼接

一、项目所涉及到的一些知识点 Ⅰ&#xff0c;BF(Brute-Force)暴力匹配&#xff1a;把两张图像的特征点全部给算出来&#xff0c;然后使用归一化的欧氏距离比较这两张图像上特征点之间的大小关系&#xff0c;越小越相似。 SIFT算法 import cv2 import numpy as np import ma…

找回自建SVN密码

自建了一个SVN Repo自己用。重装系统之后密码忘了。 经过了漫长的Google过程&#xff0c;才知道Repo中的密码居然是明文保存的。 在yourRepoDir/conf/svnserve.conf下的password-db处设置&#xff0c;通常是yourRepoDir/conf/passwd文件。 打开passwd文件&#xff0c;就是明文保…

ruby hash方法_Ruby中带有示例的Hash.invert方法

ruby hash方法Hash.invert方法 (Hash.invert Method) In this article, we will study about Hash.invert Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will understand this method with …

leetcode 216. 组合总和 III 思考分析

可能需要回顾的文章; leetcode 77. 组合 思考分析 1、题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。 解集不能包含重复的组合。 2、递归 这一题和之前…

【Unity】Update()和FixedUpdate()

Update()每帧调用&#xff0c;FixedUpdate&#xff08;&#xff09;以指定频率被调用。可以在 Edit -> project settings -> Time -> Fixed Timestep 中设定该频率。转载于:https://www.cnblogs.com/xiayong123/p/3717002.html

约束执行区域(CER)

受约束的执行区域 (CER) 是创作可靠托管代码的机制的一部分。CER 定义一个区域&#xff0c;在该区域中公共语言运行库 (CLR) 会受到约束&#xff0c;不能引发可使区域中的代码无法完全执行的带外异常。在该区域中&#xff0c;用户代码受到约束&#xff0c;不能执行会导致引发带…

python 抓取网页链接_从Python中的网页抓取链接

python 抓取网页链接Prerequisite: 先决条件&#xff1a; Urllib3: It is a powerful, sanity-friendly HTTP client for Python with having many features like thread safety, client-side SSL/TSL verification, connection pooling, file uploading with multipart encod…

四、模拟英语四六级答题卡识别阅卷评分

一、思路分析 首先拿到答题卡照片的时候&#xff0c;需要对照片进行一系列预处理操作&#xff0c;通过透视变换将图像摆正方便后续的操作。每一道题五个选项&#xff0c;有五道题&#xff0c;通过字典存放准确答案。没有依次对答题卡进行轮廓检测&#xff0c;这里采用的是正方…

leetcode 17. 电话号码的字母组合 思考分析

题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 思考与递归程序 解空间树的宽度是输入数字对应的字符的个数&#xff0c;深度是输入的数字的个数…

Blockquotes,引用,html里面,经常用到的一个!

blockquote元素的使用已经非常多样化&#xff0c;但语义上它只适用于一件事–标记了一段你的网页被引用从另一来源。这意味着&#xff0c;如果你想让那些花俏的引文&#xff0c;<blockquote>是不是你应该使用元素。让我们看一看如何你应该使用此元素&#xff1a; <art…

仔细分析了下这7行,貌似时间复杂度,空间复杂度都不大,为嘛就是执行效率这么低?...

for(Girl girl Girls.first(); !myGirlFriend.like(me); girl Girls.next()){if(!girl.hasBoyFriend(now) && i.like(girl)) { GirlFriend myGirlFriend (GirlFriend)girl; }} 转载于:https://www.cnblogs.com/naran/archive/2011/12/28/2305467.html…

BHMS的完整形式是什么?

BHMS&#xff1a;顺势疗法医学和外科学士 (BHMS: Bachelor of Homeopathic Medicine and Surgery) BHMS is an abbreviation of Bachelor of Homeopathic Medicine and Surgery. It is a medical degree program for under graduation in Homeopathy; an alternative move towa…

c++编程思想2 --友元存储控制

友元friend在c中的应用 我们知道在c的类访问权限中,private和 protected在类外面进行访问的时候 会因为权限而不能访问 &#xff0c;友元就解决了这个问题 。 可以这样理解&#xff0c;他为外部的 函数 或者类 进行了 访问授权,其实这已经超出OOP的范畴,但是对于C而言是以实用…

WordPress Event Easy Calendar插件多个跨站请求伪造漏洞

漏洞名称&#xff1a;WordPress Event Easy Calendar插件多个跨站请求伪造漏洞CNNVD编号&#xff1a;CNNVD-201309-083发布时间&#xff1a;2013-09-11更新时间&#xff1a;2013-09-11危害等级&#xff1a; 漏洞类型&#xff1a;跨站请求伪造威胁类型&#xff1a;远程CVE编号&…

XML转txt格式脚本

一、东北大学老师收集的钢材缺陷数据集是XML格式的&#xff0c;但是YOLOv5只允许使用txt文件标签 例如其中一种缺陷图片所对应的标签&#xff1a;crazing_1.xml <annotation><folder>cr</folder><filename>crazing_1.jpg</filename><source&…

python程序生成exe_使用Python程序生成QR代码的Python程序

python程序生成exeQR code is a short form of the quick response code. It is a type of matrix barcode that contains some information like some specific link, important message, email-id, etc. In Python, the qrcode module is used to generate the QR code of so…

leetcode 242. 有效的字母异位词 思考分析

题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 我们先考虑低阶版本&#xff0c;认为字符只有26种可能&#xff0c;然后将a ~ z的字符映射到数组的索引0 ~ 25&#xff0c;数组中存放的则是该索引出现的频次。 记录下s的频次和t的频次…

总结一下ERP .NET程序员必须掌握的.NET技术,掌握了这些技术工作起来才得心应手...

从毕业做.NET到现在&#xff0c;有好几年了&#xff0c;自认为只能是达到熟练的水平&#xff0c;谈不上精通。所以&#xff0c;总结一下&#xff0c;自己到底熟练掌握了哪些.NET方面的开发技术&#xff0c;以此对照&#xff0c;看看还有哪些不足&#xff0c;欢迎补充。 1 .NET …

js \n直接显示字符串_显示N个字符的最短时间

js \n直接显示字符串Problem statement: 问题陈述&#xff1a; You need to display N similar characters on a screen. You are allowed to do three types of operation each time. 您需要在屏幕上显示N个相似的字符。 每次允许您执行三种类型的操作。 You can insert a c…