LeetCode
文章平均质量分 55
weixin_43826475
这个作者很懒,什么都没留下…
展开
-
LeetCode 17. 电话号码的字母组合
17. 电话号码的字母组合 这道题目一看题目要求所有的可能的情况,我首先就想到了回溯算法。但是在回溯过程中遇到了一些问题。 一、回溯法 回溯算法的三部曲当时做的时候忘了,现在回忆如下:确定参数、确定终止条件,确定单层逻辑。 1. 参数 在这里很容易想到的是,需要一个全局变量来存最后的结果,定义为vector<string> res;然后是看递归进行到哪里了,所以需要一个索引——int index;最后需要输入我们要处理的字符串 string digits。 因此可以写出回溯算法的头部:原创 2021-03-08 09:22:23 · 82 阅读 · 0 评论 -
LeetCode 5. 最长回文子串
5. 最长回文子串 这道题目是要找到一个字符串中的最长回文子串。主要有两种方法:1. 中心扩展;2. 动态规划。两种方法都没想到最开始,后来看了解析,自己理解了会了。 一、中心扩散法 中心扩散法,比较好理解,就是根据回文字符串的定义:是中心对称的。因此,我们先定义一个中心的字符。这里要注意,一个回文字符串的长度可能是奇数,也可能是偶数,因此要加以区分。如果是奇数,那么最中间必定是一个字符,如果是偶数那么中间是空。 为了找到最长的回文串,对于每个字符,我们考虑两个情况:如果这个字符是中心的(奇数),如原创 2020-12-30 19:54:06 · 73 阅读 · 0 评论 -
backtrack-回溯搜索算法总结
backtrack——回溯算法总结 这几天着重在刷LeetCode有关回溯搜索算法的题,之前也写了一些博客,感觉当时清楚,但是原理上还是有点模糊。之前根据别人的模板,依葫芦画瓢,解决了一些问题,但是有的时候条件变了,就有点理不清楚了,特别是哪里该加一些限制条件,很懵逼。所以总结了一下。 1. 到底什么是回溯? 回溯算法,都知道是基于递归的算法。那为什么要用递归呢,可以用传统的写法代替嘛?之所以用递归,就是因为如果用传统的方式,很难写或者根本写不出来。举个例子,比如我们想知道用集合nums = [1, 2,原创 2020-12-14 18:41:18 · 608 阅读 · 0 评论 -
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 这一题理解起来还是比较简单的,就是找到某个数字在数组中的最开始和最后的位置。 关键思路:两次 二分法。 1. 初步想法 我自己在做的时候,就想得很简单。首先题目要log(n)的时间复杂度,那么很容易想到二分法。所以我的思路是,先用二分法找到target的位置,然后分别向前和向后查找,就可以找到第一和最后的位置。 class Solution { public: vector<int> searchRange(vector<int&原创 2020-12-09 11:45:48 · 67 阅读 · 0 评论 -
LeetCode 47. 全排列 II
47. 全排列 II 这一题跟46题——全排列,非常类似。但是不同的是,这一题给的集合中有重复的元素。所以关键是要怎么处理这些重复的元素,在保证一个结果中可以出现重复数字的情况下,最后的结果集中又不能有一样的解。 举个例子,比如:nums = [1, 1’, 3], target = 5; 那么正确的结果为: [ [1,1’,3], [1,3,1’] [3,1,1’] ] 可以看到,一个正确的解中可以包含重复的数字(1和1’),但结果中没有重复的解,比如[1, 1’, 3]和[1’, 1, 3]。原创 2020-12-08 11:03:59 · 74 阅读 · 0 评论 -
LeetCode 40. 组合总和 II
40. 组合总和 II 这一题跟39题非常类似,但是不同的是,这一题给的集合中有重复的元素。所以关键是要怎么处理这些重复的元素,在保证一个结果中可以出现重复数字的情况下,最后的结果集中又不能有一样的解。 举个例子,比如:nums = [1, 2, 2, 2, 5], target = 5; 那么正确的结果为: [ [1,2,2], [5] ] 可以看到,一个正确的解中可以包含重复的数字(2),但结果中没有重复的解,比如[1, 2, 2]和[2, 1, 2]以及[2, 2, 1]。 1. 如何避免重复?原创 2020-12-07 20:43:42 · 54 阅读 · 0 评论 -
LeetCode 39. 组合总和
39. 组合总和 做了46题之后,大概明白了回溯搜索是怎么回事,紧接着我就回过头来做了这道题(怎么感觉有点回溯那味儿了?哈哈哈可能这就是缘分吧),结果一把过!我分析了一下,这道题的基本框架跟46-全排列差不多,都要搜索所有的情况,但是有一些不一样的地方: 1. 终止的条件不一样:46题中要把给定数组中的数字都用一遍,所以终止条件是一个答案(path)中的元素个数等于给定数组的元素个数(length);而在这里,我们要找到一组目标元素,使得加起来等于目标值,所以最后的终止条件应该跟目标值target有原创 2020-12-02 19:33:28 · 68 阅读 · 0 评论 -
LeetCode 46. 全排列
46. 全排列 我是从第39题——组合总和,然后看解析找到了这一题,重头学习了 “回溯搜索” 算法。最开始推导出了树形结构,也知道要递归,但不知道该怎么递归,后面才了解到要用这个回溯算法,感觉第一次接触???或者是忘了,所以从头学了下。 总的思路: 基于递归的回溯搜索 1. 回溯搜索 做到第39题,了解到了这个词,感觉很陌生,属实不应该。故,从头学习了一下这个算法。总的来说,这个算法就是枚举所有可能的组合,然后找到满足要求的结果的集合。一开始我想到了动态规划。两者的区别是,动态规划要求得到一个最原创 2020-12-02 16:01:10 · 70 阅读 · 0 评论 -
LeetCode 33. 搜索旋转排序数组
33. 搜索旋转排序数组 这一题也比较简单,刚开始拿到的时候,觉得有点棘手,不敢下手,后来看了下解析,明白了思路后,就自己写了,然后一遍过了。 总的思路: 二分查找+分类讨论 1. 传统的二分法 传统的二分法十分简单,首先找到中间的,比较是否等于目标值,如果等于则返回,如果不等,则相应调整上边界或者下边界。一个简单的代码如下,但是要注意一些细节。 int BinarySearch(int nums[], int target) { int low = 0, high = sizeof(nums) - 1,原创 2020-12-01 15:08:24 · 67 阅读 · 0 评论