leetcode刷题详解十四

39. 组合总和
vector<vector<int>> res;
vector<int> temp;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {back_tracing(candidates, 0, 0, target);return res;
}void back_tracing(vector<int>& candidates,int sum, int start, int target){if(sum == target){res.push_back(temp);return;}else if(sum > target ){return;}for(int i = start; i < candidates.size(); i++){temp.push_back(candidates[i]);sum += candidates[i];back_tracing(candidates, sum, i, target);sum -= candidates[i];temp.pop_back();}
}
  • 重点总结

    这道题和77题组合问题的相同点和难点主要在于下面这几行代码:

    for(int i = start; i <= n; i++){//处理节点back_tracing(n, k, i+1);  /**或者**/   back_tracing(n, k, i)//回溯}
    

    如果递归函数有个参数是i+1的话,则在递归层遍历中,取的值是不包含本身的下一个。

    比如1 2 3 4,横向层次取1时候下次层递归的时候

    1. i+1:应该选择2 3 4
    2. i:应该选择1 2 3 4

    横向层次取2的时候

    1. i+1: 应选择 3 4
    2. i:应选择 2 3 4
40. 组合总和 II

和47题条件一样,但是本质是属于求组合数的。

vector<vector<int>> res;
vector<int> temp;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {int len = candidates.size();sort(candidates.begin(), candidates.end());vector<bool> is_used(len, false);back_tracing(candidates, target, len, 0, 0, is_used);return res;
}
void back_tracing(vector<int>& candidates, int target, int len, int start, int sum, vector<bool>& is_used){if(sum == target){res.push_back(temp);return;}else if(sum > target){return;}for(int i = start; i < len; i++){//这道题和47题特别想,一个是排列一个是组合//关键就在于i=start还是i=1if(i > 0 && is_used[i-1]==false && candidates[i-1] == candidates[i]){continue;}temp.push_back(candidates[i]);is_used[i] = true;sum += candidates[i];back_tracing(candidates, target, len, i+1, sum, is_used);sum -= candidates[i];temp.pop_back();is_used[i] = false;            }}
216. 组合总和 III
vector<vector<int>> res;
vector<int> temp;
vector<vector<int>> combinationSum3(int k, int n) {vector<int> num = {1,2,3,4,5,6,7,8,9};back_tracing(num, n ,k ,0, 0);return res;
}void back_tracing(vector<int>& num, int n, int k, int sum, int start){if(temp.size() == k && sum == n){res.push_back(temp);return;}else if(sum > n){return;}for(int i = start; i < num.size(); i++){temp.push_back(num[i]);sum += num[i];back_tracing(num, n, k, sum, i+1);sum -= num[i];temp.pop_back();}
}

跟40题很相似,基本一样,但是已经排好序了没有重复,所以不用考虑重复的问题。

分割问题

131. 分割回文串

这道题的思路不要太简单,主要有两个点:一个函数用来判断是否是回文,一个用来分割字符串。

vector<string> tmp;
vector<vector<string>> res;
vector<vector<string>> partition(string s) {int len = s.size();back_tracing(s, len, 0);return res;}void back_tracing(string s, int len, int start){if(start >= len){res.push_back(tmp);return;}for(int i = start; i < len; i++){string tmp_str = s.substr(start, i-start+1);if(is_palindrome(tmp_str)){tmp.push_back(tmp_str);}else{//重要!!!continue;}back_tracing(s, len, i+1);tmp.pop_back();}
}bool is_palindrome(string& str){int len = str.size();if(len == 1){return true;}int l = 0;int r = len - 1;while(l < r){if(str[l] == str[r]){l++;r--;}else{return false;}}return true;
}
  • 涉及到的知识

    • 判断是否回文,有字符串,链表的。字符串的判断就是如上代码,一个while循环,一个从0开始,一个从最后一个位置索引开始,依次比较是否相等

    • 分割字符串,需要递归遍历,用到了回溯算法。这里面有几个值得注意的点

      • if中结束条件。这个题如果有满足的想加入到vector数组中,苦思冥想,不知道该什么时候加入。这道题给了我们思路,当遍历原始字符串长度大于的时候就结束了了!为啥等于呢,因为最后一位单个肯定是回文字符串

      • 截取子串是substt(pos, pos+count),注意是[pos, pos+count],包括两端。

        同时这个count是长度,所以在代码中表现为i - start +1

(字节)93. 复原 IP 地址

跟上题分割回文串一样的思路,我们先分割字符串。但是ip地址一共有四个段,所以我们的temp数组只要存储有四段string字符串就可以开始判断,如果满足ip地址的要求就加入,不满足就return;

vector<string> res;
vector<string> tmp;
vector<string> restoreIpAddresses(string s) {int len = s.size();back_tracing(s, len, 0);return res;
}
void back_tracing(string s, int len, int start){if(start == len && tmp.size() == 4){string str_ip = tmp[0];for(int i = 1; i < 4; i++){str_ip  = str_ip + "." + tmp[i];}res.push_back(str_ip);return;}if(start < len && tmp.size() == 4){return;}for(int i = start; i < len; i++){//分割子串,这里是重点!!!string str_tmp = s.substr(start , i - start + 1);if(!jarge(str_tmp)){break;}cout<<"str_tmp"<<str_tmp<<endl;tmp.push_back(str_tmp);back_tracing(s, len, i+1);tmp.pop_back();}
}
bool jarge(string s){if(s.size() > 1 && s[0] == '0'){return false;}int a = atoi(s.c_str());if(a > 255){return false;}return true;
}
  • 存在的问题

    • 第一点是最开始我们用temp变量来存储分割出来满足ip的字符串,但是这会存在一个问题,当我们回溯的时候,不好去删除string temp之前加入进来的值,这个真的不好删除,特别不好写,所以这样不行。另外一个思路是用vector数组来存储,这样回溯的时候可以pop。

    • ip地址共有四段,但是第四段不好截取。因此我们就在if中判断,如果有三段之后,随后一段截取就很方便,如代码string last = s.substr(start, s.size() -1);如果last符合ip规则,我们temp数组就有四段,可以拼接到一起

      如果last不满足,则直接返回,temp数组回溯的时候也一次出来

    • for循环时候,还是要i+1,因为递归层不能重复取当前值,而是从下一个值开始取得

    • "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"这个回答会超时,记住要判定string长度大于13直接pass!

  • c++知识点

    • 截取子串是substr(pos, pos+count)
    • string转换成int用的是stoi,但是切记stoi能转换的最大数组长度到10,因此要判断如果string长度大于10就直接返回,肯定不满足,当时一直在这个点报错。

子集问题

78. 子集

组合问题,分割问题都是关注叶子节点,而子集问题却要关注树的每个节点,都要遍历到。

同样不能出现重复,因此for循环从start开始

图片
vector<vector<int>> res;
vector<int> temp; 
vector<vector<int>> subsets(vector<int>& nums) {back_tracing(nums, 0);return res;
}
void back_tracing(vector<int>& nums, int start){res.push_back(temp);for(int i = start; i < nums.size(); i++){temp.push_back(nums[i]);back_tracing(nums, i+1);temp.pop_back();}
}
90. 子集 II

跟78题比较,主要是在去重上

vector<vector<int>> res;
vector<int> temp;
vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<bool> use_check(nums.size(), false);sort(nums.begin(), nums.end());back_tracing(nums, 0, use_check);return res;
}
void back_tracing(vector<int>& nums, int start, vector<bool>& use_check){res.push_back(temp);for(int i = start; i <nums.size(); i++ ){if(i > 0 && nums[i] == nums[i-1] && use_check[i-1] == false){continue;}temp.push_back(nums[i]);use_check[i] = true;back_tracing(nums, i+1, use_check);temp.pop_back();use_check[i] = false;}
}
  • 总结

    去重主要由两种:

    1. 不加use_check数组

       if(i > 0 && nums[i] == nums[i-1]){continue;}
      

      不加use_check数组的话,对于同一层元素,如果有重复我们就是不能用它,如下图:

      图片

      对于同一树枝来说,第三层得自己[1 ,2],第四层的[1, 2, 2]如果不加use_check数组,肯定得不到122这个数组,当if判断的时候就跳过了,但我们还要用到2,所以上述代码不合适。

    2. 加use_check数组

      if(i > 0 && nums[i] == nums[i-1] && use_check[i-1] == false){continue;}
      

      used[i - 1] == true,说明同一树支candidates[i - 1]使用过

      used[i - 1] == false,说明同一树层candidates[i - 1]使用过

      而我们要对同一树层使用过的元素进行跳过。

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

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

相关文章

如何使用Windows自带的IIS服务搭建本地站点并远程访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xf…

5款最佳替代Sketch软件,第一款简直令人叹为观止!

Sketch是Mac平台上专门为用户界面设计的矢量图形绘制工具。Sketch简单的界面背后有优秀的矢量绘图能力和丰富的插件库。但遗憾的是&#xff0c;Sketch只能在Mac平台上使用和浏览&#xff0c;是本地化工具&#xff0c;云共享功能并不完善。本文盘点了5个Sketch替代软件&#xff…

MAVEN冲突解决

MAVEN冲突解决 1.安装下面这个插件 2.安装成功点击pom文件 dependency analyzer标志&#xff0c;说明maven helper插件就安装成功 3.点击dependency analyzer之后就会进入到下面的页面 4.标记红色就是版本冲突&#xff0c;右击complie&#xff0c;排除不是使用的 5.POM 文件…

基于深度学习的表情动作单元识别综述

论文标题&#xff1a;基于深度学习的表情动作单元识别综述 作者&#xff1a;邵志文1&#xff0c;2&#xff0c;周 勇1&#xff0c;2&#xff0c;谭 鑫3&#xff0c;马利庄3&#xff0c;4&#xff0c;刘 兵1&#xff0c;2&#xff0c;姚 睿1&#xff0c;2 发表日期&#xff1a…

RabbitMQ的Web管理页面

访问页面 http://IP:15672/账号密码默认都是&#xff1a;guest 主页概览 Overview 显示当前RabbitMQ Broker的运行信息、连接信息、集群信息以及配置信息等。 连接 Connections 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#…

【正点原子STM32连载】 第六十一章 USB读卡器(Slave)实验摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32F407最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第六十…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场&#xff0c;Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中&#xff0c;如是说道。这是一种愿景&#xff0c;更是Samtec的努力方向。短短一句话&#xff0c;…

notepad++ 插件JSONView安装

1&#xff0c;前提 开发过程中经常需要处理json格式语句&#xff0c;需要对json数据格式化处理&#xff0c;因为使用的是虚拟机内开发&#xff0c;所以没法连接外网&#xff0c;只能在本地电脑下载插件后&#xff0c;然后上传到虚拟机中&#xff0c;进行安装使用。 2&#xf…

1+x中级网络运维实验题

任务 1&#xff1a; 设备命名 为了方便后期维护和故障定位及网络的规范性&#xff0c;需要对网络设备进行规范化命名。请根据 Figure 3-1 实验考试拓扑对设备进行命名。命名规则为&#xff1a;城市-设备的设置地点-设备的功能属性和序号-设备型号。例如&#xff1a;处于杭州校…

@Autowired注解获取对象为null

问题再现 兄弟们&#xff0c;看见了吗&#xff1f;这里我Autowired进来的forkliftService 居然为null 且我SysForkliftServiceImpl上面是加了Service注解的 分析原因 主要原因就是因为该类继承了一个第三方框架SimpleChannelInboundHandler&#xff0c;在执行的过程中&#…

2023年【P气瓶充装】找解析及P气瓶充装复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装找解析参考答案及P气瓶充装考试试题解析是安全生产模拟考试一点通题库老师及P气瓶充装操作证已考过的学员汇总&#xff0c;相对有效帮助P气瓶充装复审模拟考试学员顺利通过考试。 1、【多选题】CNG双燃料汽车…

【IEEE独立出版】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff09; 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff0…

电商API接口对于实现电商系统平台的搭建有哪些作用?

电商API接口用于实现电商平台的数据交互和功能调用。具体来说&#xff0c;电商API接口可以用于以下几个方面&#xff1a; 1. 商品管理&#xff1a;通过API接口&#xff0c;可以实现商品的添加、修改、删除、查询等操作。商家可以通过API接口将自己的商品信息上传到电商平台&…

三、Linux高级命令

目录 1、重定向命令 1.1 重定向 > 1.2 重定向 >> 该章节的所有操作都在/export/data/shell目录进行&#xff0c;请提前创建该目录。 mkdir -p /export/data/ 1、重定向命令 1.1 重定向 > Linux 允许将命令执行结果重定向到一个文件&#xff0c;本应显示在…

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合

群晖NAS&#xff1a;docker&#xff08;Container Manager&#xff09;、npm安装Verdaccio并常见命令集合 自建 npm 资源库&#xff0c;使用Verdaccio。如果觉得麻烦&#xff0c;直接可以在外网注册 https://www.npmjs.com/ 网站。大同小异&#xff0c;自己搭建搭建方便局域网…

虾皮、Lazada稳定的测评系统需要哪些技术要求

测评作为一项高效运营手段&#xff0c;具有显著的重要性。然而&#xff0c;对于卖家而言&#xff0c;自行建立一套测评系统所需的技术条件并非易事。 在构建系统之前&#xff0c;必须深入理解每个平台的控制风险机制&#xff0c;而后才能开展下一步的建设工作。 1.首先&#…

代币化:2024年的金融浪潮预示着什么?

自“TradFi”领袖到加密专家&#xff0c;各方预测代币化机会高达数十万亿。虽然已有引人注目的用例&#xff0c;但与未来几年可能在链上转移的大量数字化资产相比&#xff0c;这些仅是冰山一角。 代币化何时会变为洪流&#xff1f;什么阻碍了其发展&#xff1f; 今年10月&…

VGN S99快捷键,说明书

VGN S99快捷键-说明书 按键说明灯光效果常见疑难 按键说明 切换关闭电量指示灯&#xff1a;Fn home 灯光效果 常见疑难

微服务API网关Spring Cloud Gateway实战

概述 微服务网关是为了给不同的微服务提供统一的前置功能&#xff1b;网关服务可以配置集群&#xff0c;以承载更多的流量&#xff1b;负载均衡与网关互相成就&#xff0c;一般使用负载均衡&#xff08;例如 nginx&#xff09;作为总入口&#xff0c;然后将流量分发到多个网关…

mybatis参数输入 #{}和${}

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…