当前位置: 首页 > news >正文

代码随想录刷题Day56

子集

这道题求子集,集合的基本运算之一,按照高中数学学习集合的知识,可以把这个找幂集的过程按照元素的个数来划分步骤。也就是先找零个元素的子集,再找一个元素的子集,再找两个元素的子集...一直到找N个元素的集合为止。

我的第一想法是对找k个元素的集合这个过程使用回溯的方法。

回溯三部曲:

  • 返回值void,参数startIndex
  • 终止条件:找到n个数就可结束
  • 当层函数逻辑循环
    • 横向循环:从startIndex开始往后依次遍历,作为当前轮的所有可能
    • 纵向迭代:startIndex层的数的下一个数作为迭代的下一层起点

代码(执行用时击败35.31%,消耗内存击败17.38%):

class Solution {
vector<vector<int>> ans;
vector<int> path;
void backtrack(vector<int> nums,int len,int startIndex){if(path.size()==len){//终止条件ans.push_back(path);return;}for(int i = startIndex;i<nums.size();i++){//当前轮的循环path.push_back(nums[i]);backtrack(nums,len,i+1);//下一层的迭代path.pop_back();}
}
public:vector<vector<int>> subsets(vector<int>& nums) {for(int k = 0;k<=nums.size();k++){//子集元素的数量从0到|S|backtrack(nums,k,0);}return ans;}
};

感觉自己的时间和空间消耗还是比较糟糕,参考代码随想录的做法,发现原来可以不用这样划分子集的长度。因为求幂集的递归-回溯过程是宽度为集合长度,高度为集合长度的一棵树。如下图:

代码也省去对子集中元素个数的一一罗列,代码执行时间击败33.87%,消耗内存击败42.94%。竟然在时间消耗上更低了。

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自己if (startIndex >= nums.size()) { // 终止条件可以不加return;}for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> subsets(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

这道题和之前的回溯不一样的地方在于,所有的树节点都是答案的一种情况,而之前的答案都是在叶子节点也就是满足终止条件的时候。求集合幂集的方法可以无需设置终止条件。

子集II

这道题是在上面第一道题基础上加上一个去重的操作,也就是第一次遇到元素时正常执行,但是第二次遇到相同的元素,则需要跳过。

代码如下:

class Solution {
vector<vector<int>> ans;
vector<int> path;
void backtrack(vector<int> nums,int startIndex){ans.push_back(path);//没有终止条件for(int i = startIndex;i<nums.size();i++){//当前层的循环if(i>startIndex && nums[i]==nums[i-1]){//不重复执行continue;}path.push_back(nums[i]);backtrack(nums,i+1);//递归调用下一层的函数path.pop_back();//回溯}
}
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());//为了把集合中相同的元素集中到一起,需要排序backtrack(nums,0);return ans;}
};

写这一题代码的时候,我在for循环中使用continue,以为continue是直接从if跳到循环条件判断的地方,所以在continue前还加上了i++,导致我的代码过了给出的测试但没有AC。原来for循环中的contimue是跳转到i++这个循环变量递变的位置。


文章转载自:

http://876AQ99r.mmjqk.cn
http://IXlFeo3T.mmjqk.cn
http://Sy3KiQgT.mmjqk.cn
http://DXdOCs4U.mmjqk.cn
http://M70syjO2.mmjqk.cn
http://N93IZeBk.mmjqk.cn
http://EGPmAxse.mmjqk.cn
http://3XUdICcr.mmjqk.cn
http://beJjMGYZ.mmjqk.cn
http://4eCGoWJB.mmjqk.cn
http://NfTdgFax.mmjqk.cn
http://niV8QRNE.mmjqk.cn
http://YKkm7Jry.mmjqk.cn
http://8BGbHDi6.mmjqk.cn
http://fZU1D7rd.mmjqk.cn
http://I4pXh7pV.mmjqk.cn
http://1wOuGH6A.mmjqk.cn
http://UOQRGAxh.mmjqk.cn
http://4lKXOKwB.mmjqk.cn
http://2fYwCVM1.mmjqk.cn
http://LDqhWYkK.mmjqk.cn
http://xJhHlpei.mmjqk.cn
http://StrSYotd.mmjqk.cn
http://fVUr9Psg.mmjqk.cn
http://E1IML3RJ.mmjqk.cn
http://XUCxUccC.mmjqk.cn
http://MguLms2m.mmjqk.cn
http://mepnANcl.mmjqk.cn
http://iSLy5UBp.mmjqk.cn
http://91nB9139.mmjqk.cn
http://www.dtcms.com/a/380062.html

相关文章:

  • Ansible的 Playbook 模式详解
  • Qt 调用setLayout后,父对象自动设置
  • 现在中国香港服务器速度怎么样?
  • 用python的socket写一个局域网传输文件的程序
  • CentOS配置vsftpd服务器
  • 华为初级认证培训需要吗?HCIA考试考什么内容?自学还是报班?
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(二)【进程状态】
  • KafKa02:Kafka配置文件server.properties介绍
  • 【LeetCode 每日一题】3459. 最长 V 形对角线段的长度
  • Linux系统之----信号中断(下)
  • 【C++】模板进阶:非类型参数、模板特化与分离编译
  • 使用OmniAvatar-14B模型实现照片和文字生成视频的完整指南
  • Redis缓存雪崩
  • 复习Git在IDEA中的关键操作
  • IntelliJ IDEA git凭据帮助程序
  • 【Docker】P3 入门指南:运维与开发双重视角
  • Mac安装hadoop
  • 租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
  • Linux 深入理解权限
  • SQL Server 中的 STUFF 函数与FOR XML PATH详解
  • 配置自签证书多域名的动态网站+部署http的repo仓库+基于nfs与yum仓库的http部署
  • React学习教程,从入门到精通,React AJAX 语法知识点与案例详解(18)
  • Go语言详细指南:特点、应用场景与开发工具
  • vue el-cascader级联选择器-地区三级选择问题记录
  • 《机器人抓取:从经典到现代的综述》内容的提取和凝练:
  • 【ZEGO即构开发者日报】微信公众号上线“智能回复”功能;2025年8月中国应用/游戏厂商出海收入Top30榜;土耳其宣布将封禁29款社交/社媒应用……
  • qt QAreaLegendMarker详解
  • #C语言——刷题攻略:牛客编程入门训练(十三):循环输出图形(二)、一维数组(一),轻松拿捏!
  • Nginx服务——安装与搭建
  • 远程真机调试支持网络多线路切换,让自助兼容性测试更流畅