自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 Leetcode-64:最小路径和

个人思路总结:==动态规划问题。==我们新建一个额外的 dp 数组,与原矩阵大小相同。在这个矩阵中,dp(i, j) 表示从坐标 (i, j) 到右下角的最小路径权值。我们初始化右下角的 dp 值为对应的原矩阵值,然后去填整个矩阵,对于每个元素考虑移动到右边或者下面,因此获得最小路径和我们有如下递推公式:dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))...

2019-05-28 22:40:58 159

原创 Leetcode-63:不同路径II

个人思路总结:1、如果第一个格点 obstacleGrid[0,0] 是 1,说明有障碍物,那么机器人不能做任何移动,我们返回结果 0。2、否则,如果 obstacleGrid[0,0] 是 0,我们初始化这个值为 1 然后继续算法。3、遍历第一行,如果有一个格点初始值为 1 ,说明当前节点有障碍物,没有路径可以通过,设值为 0 ;否则设这个值是前一个节点的值 obstacleGrid[i,...

2019-05-28 22:11:26 158

原创 Leetcode-62:不同路径

个人思路总结:这道题有两种实现方式,我都讲一下:1、递归(时间复杂度太高)太简单了。。。直接上代码(leetcode里面部分测试用例超时了)class Solution {public: int uniquePaths(int m, int n) { return dfs(m,n); } int dfs(int m, int n) {...

2019-05-23 22:20:12 172

原创 Leetcode-61:旋转链表

个人思路总结:这道题的难点就是如何找到那个旋转点。步骤如下:1、遍历链表,保存长度(count)2、找到分割点(k%count),然后将尾部向前数第K个元素作为头,原来的头接到原来的尾上代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n...

2019-05-23 22:06:14 112

原创 Leetcode-60:第k个排列

个人思路总结:C++递归解答,根据k和n的值确定string res中每一位的取值。我们知道排列的每一位上都有n种选择,而每一种选择都有(n-1)!种排列方式。因此我们要从左往右依次确认每一位上应该取什么值。判断的方式就是每一位各种选择的排列总数之和是否大于k,一旦大于k,就可以确定此时的那个数字可以作为当前位的数字了。然后删除这个数字,进行下一次递归。代码如下:class Solutio...

2019-05-22 22:29:41 123

原创 Leetcode-58:最后一个单词的长度

个人思路总结:从后往前数,注意判断最后一个单词前后两空格的位置。代码如下:class Solution {public: int lengthOfLastWord(string s) { int len = s.size(); int count = 0; for(int i=len-1;i>=0;i--) {...

2019-05-22 20:43:59 168

原创 Leetcode-57:插入区间

个人思路总结:可以先用二分法找到插入区间的位置,得到一个新的区间数组,在采用上一题中合并区间一样的做法,区别是省去了排序步骤。注意题目给出一个无重叠的 ,按照区间起始端点排序的区间列表。因此找到插入位置后,我们可以把插入位置前的区间全部插入到目标vector中而不用进行重叠操作(因为它们已经是不重叠的了)。只需考虑插入位置后的重叠操作。代码如下:class Solution {publi...

2019-05-21 22:24:28 114

原创 Leetcode-56:合并区间

个人思路总结:对第一位进行排序,然后根据第二位的大小关系合并。这里在排序时需要注意一下,因为不能直接调用STL中的sort函数,需要自定义比较函数cmp。代码如下:class Solution {public: vector<vector<int>> result; vector<vector<int>> merge(vec...

2019-05-20 21:54:05 125

原创 Leetcode-55:跳跃游戏

个人思路总结:它更适合反过来想。我们可以从数组的倒数第二个个元素看起,每次往前遍历,如果当前的元素能够到达最后一个位置,那么我们把当前位置开始到最后全部“切断”,以当前元素为最后一个元素,重复第一次的过程就好了。而最后,如果我们遍历到数组的第一个元素,那么此题返回true,否则,你懂得。代码如下:class Solution {public: bool canJump(vector...

2019-05-18 15:43:01 140

原创 Leetcode-53:最大子序和

class Solution {public: int maxSubArray(vector<int>& nums) { int res = nums[0]; int sum = 0; for(int i=0;i<nums.size();i++) { if(sum>0)...

2019-05-18 15:41:31 136

原创 Leetcode-50:Pow(x,n)

个人思路总结:我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。代码如下:class Solution {public: ...

2019-05-18 15:29:44 197

原创 Leetcode-49:字母异位词分组

个人思路总结:首先来说说自己的思路,用两层循环,每一次内层循环都得到一个异位词vector(对每一个string都做排序,对排序后的string进行比较,如果相等的话就将其push进vector,如果不一样就跳过)。这个方法的时间复杂度为O(n^2)。因此对于最后一个变态的测试用例没有通过(超时),不过也是写出来记录一下吧。代码如下:class Solution {public: ...

2019-05-18 14:11:05 160

原创 Leetcode47:全排列II

个人思路总结:跟46题相比,只需加一步去重即可,我们这里采用set去重。==这里需要注意一下set去重的具体实现方式代码如下:class Solution {public: set<vector<int>> result; vector<vector<int>> permuteUnique(vector<int>&...

2019-05-18 13:51:52 119

原创 Leetcode-46:全排列

个人思路总结:这是一道经典的回溯算法题,可以用递归来实现。其实很多人在写递归算法时,总会纠结于每一步递归都是怎么实现的,这样往往容易把自己绕晕。我们只需要关注三件事即可:终止条件、这一步你该做什么以及返回值代码如下:class Solution {public: vector<vector<int>> result; vector<vecto...

2019-05-18 13:43:02 114

原创 Leetcode-43:字符串相乘

个人思路总结:其实这个题就是华为经常爱考的大数相乘类型题。==一个数乘以一个数的结果长度必定小于或者等于这个两个数长度之和。==这个是关键点,一定要弄清楚。具体还是看代码吧,较简单。其中有个小关键点,就是最后的int类型转string类型,在c++11中,有to_string(int)这个函数,可以将int转string。代码如下:class Solution {public: ...

2019-05-04 17:22:21 105

原创 Leetcode-42:接雨水

个人思路总结:我们可以建立两个vector(left和right),其中left[i]表示height[i]左边最大的高度,right[i]表示height[i]右边最大的高度。然后对height,从i=1到i=n-2进行遍历,得到height[i]对应的left[i]和right[i]的最小值,然后计算max(0,min(left[i],right[i])-height[i]),这个便是当前...

2019-05-04 15:49:51 86

原创 Leetcode-41:

个人思路总结:本题要求时间复杂度为O(n),且只能使用常数级别的空间。因此不能先对数组进行排序。遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。代码如下:class Solution {public: int firstMissingPositive...

2019-05-04 14:58:37 296

原创 Leetcode-40:组合总和II

个人思路总结:回溯+集合(set)去重。此题和第39题的区别主要是:此题数组中可能会有重复元素,因此我们要先对数组进行排序,如果不排序的话可能会存在[1,7]和[7,1]都满足题目要求。排序后就会出现两个[1,7]的情况,因此我们还需要对最后的结果进行去重。set去重的主要代码为:set<vector<int>> result;result.insert(tmp)...

2019-04-29 21:43:49 137

原创 Leetcode-39:组合总和

个人思路总结:此题用回溯法解决,其实个人感觉就是递归吧。代码如下:class Solution {private: vector<vector<int>> result; vector<int> tmp;public: vector<vector<int>> combinationSum(vector&l...

2019-04-29 20:55:52 88

原创 Leetcode-38:报数

个人思路总结:这个题最大的难度可能是读懂题目吧。。。题意大概为:其实就是个读数问题,如第5个是"111221" 那么第6个就是读第5个中的数字“3个1,2个2,1个1”即为“312211” 第7个读第6个数为“1个3,1个1,2个2,2个1”即为“13112221” 以此类推。然后从1开始依次循环即可。代码如下:class Solution {public: string co...

2019-04-29 20:49:21 95

原创 Leetcode-36:有效的数独

个人思路总结:这个题的一个难度就是怎么枚举每一个小子数独块。于是我偷看了大佬的方法:block_index = (i/3)*3+j/3至于怎么判断是否有重复的字符,我们可以用map数据结构(hash表)来处理。然后依次做一次遍历即可。代码如下:class Solution {public: bool isValidSudoku(vector<vector<char...

2019-04-27 15:31:07 76

原创 Leetcode-35:搜索插入位置

个人思路总结:依旧是老思路:二分+递归。代码如下:class Solution {public: int searchInsert(vector<int>& nums, int target) { int len = nums.size(); int result; search_partial(nums,0,le...

2019-04-27 14:31:44 79

原创 Leetcode-34:在排序数组中查找元素的第一个和最后一个位置

个人思路总结:这个题和33题其实是一样的,也需要用二分+递归来做。只不过和33题相比需要考虑的情况复杂一些。代码如下:class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int len = nums.size(); ...

2019-04-27 13:11:11 77

原创 Leetcode-33:搜索旋转排序数组

个人思路总结:其实此题如果用暴力法非常简单,遍历一遍即可,时间复杂度为O(n)。但是题目要求时间复杂度必须是 O(log n) 级别。因此我选择采用二分+递归来实现。代码如下:class Solution {public: int search(vector<int>& nums, int target) { int len = nums.siz...

2019-04-27 11:55:34 81

原创 Leetcode-32:最长有效括号

个人思路总结:这个题和Leetcode-20差不多,只不过那个题只需要判断有多少个有效括号。而此题需要判断有多少个连续有效括号。至于判断是否为有效括号的方法与20题类似,借助栈stack即可实现。判断最长连续子串的方法和Leetcode-3比较类似。代码如下:class Solution {public: int longestValidParentheses(string s) ...

2019-04-26 22:07:36 62

原创 Leetcode-31:下一个排列

个人思路总结:其实就是从数组倒着查找,找到nums[i] 比nums[i+1]小的时候,就将nums[i+1]到nums[nums.length - 1]进行排序。排序后,找到第一个比nums[i]大的数据,将其与nums[i]互换即可。需考虑的边界情况:(1)只有一个元素或者为空,不做处理(2)原数组已经为最大,即所有元素递减排列,将其反序变到最大即可。代码如下:class Solu...

2019-04-25 22:16:42 72

原创 Leetcode_30

个人思路总结:此题虽然在leetcode上超时没有通过,但个人觉得自己的思路没有错误。也仅仅是最后一个测试用例超时,我也看了最后一个测试用例,十分变态,粘出来感受一下:“ababababababababababababababababababababababababababababababababababababababababababababababababababababababababa...

2019-04-25 21:21:31 295

原创 Leetcode-27:移除元素

个人思路总结:和26题一样,利用双指针。只不过唯一的区别是第二个指针从头开始遍历。代码如下:class Solution {public: int removeElement(vector<int>& nums, int val) { int len = nums.size(); int i = 0; for(in...

2019-04-23 20:21:10 65

原创 Leetcode-28:实现strStr()

个人思路总结:可以遍历一次,找到第一个相等的就可以返回。可以利用c++自带的substr()函数。代码如下:class Solution {public: int strStr(string haystack, string needle) { int len_needle = needle.size(); int len_haystack = ha...

2019-04-23 20:15:58 72

原创 基于Leetcode-26的个人扩展:去除字符串的重复字符(空间复杂度 O(1) )

跟Leetcode-26完全一样的思路,以后碰到这种题要注意。代码如下:#include<iostream>#include<vector>#include<algorithm>#include<string>using namespace std;int main(){ string str; getline(cin...

2019-04-22 21:36:20 295

原创 Leetcode-26:删除排序数组中的重复项

个人思路总结:双指针法:数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j],我们就增加 j 以跳过重复项。当我们遇到 nums[j]=nums[i] 时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到 nums[i + 1]。然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末...

2019-04-22 21:27:02 71

原创 Leetcode-25:k个一组翻转链表

个人思路总结:和24题一样,依旧采用递归三部曲的形式。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class ...

2019-04-22 21:08:10 85

原创 Leetcode-24:两两交换链表中的节点

个人思路总结:使用递归来解决该题,主要就是递归的三部曲:找终止条件:本题终止条件很明显,当递归到链表为空或者链表只剩一个元素的时候,没得交换了,自然就终止了。找返回值:返回给上一层递归的值应该是已经交换完成后的子链表。单次的过程:因为递归是重复做一样的事情,所以从宏观上考虑,只用考虑某一步是怎么完成的。我们假设待交换的俩节点分别为head和next,next的应该接受上一级返回的子链表(参...

2019-04-22 20:59:01 220

原创 Leetcode-23:合并K个排序链表

个人思路总结:本题有两种方法可以实现:(1)分治法(2)利用小顶堆(1)分治法:突然觉得分治法很有哲学思想啊,大事化小,小事化了。跟归并排序的思维一样,不再详细叙述了,直接上代码。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ...

2019-04-18 16:33:57 89

原创 Leetcode-22:括号生成

个人思路总结:俗话说,任何问题都是可以通过暴力法解决的。我们可以找出所有可能的排序,然后一一比对是否符合规则,但这种方法太低效。==递归回溯法:==只有在我们知道序列仍然保持有效时才添加 ‘(’ 或 ‘)’,而不是像暴力法那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括...

2019-04-18 14:06:23 71

原创 Leetcode-21:合并两个有序链表

个人思路总结1、非递归实现:对两个链表的最左端依次比较,小的先加入到输出链表中。然后依次遍历即可2、递归实现:和非递归思维差不多,只不过实现形式略有区别代码如下:1、非递归/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ...

2019-04-17 22:07:40 63

原创 Leetcode-20:有效的括号

个人思路总结:先来说一说普通的思路吧。其实需要借助栈来完成。对字符串进行遍历,如果碰到’(、’{’、’[‘的话,就进栈。如果碰到’)、’}’、’]'的话,就与栈顶进行比较,如果相等的话,则将栈顶出栈。否则直接输出false。当全部遍历完之后,如果此时栈为空,则返回true。否则,返回false。代码如下:class Solution {public: bool isValid(s...

2019-04-17 21:36:51 68

原创 Leetcode-19:删除链表的倒数第N个节点

个人思路总结:==这种题应该是单链表类型的经典题目了吧!==其实就是一个快慢指针问题,掌握这个思维的话,做这种题我个人感觉类似于做1+1=2这种题目。由于过于简单,我就不写思路了,看代码吧。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n...

2019-04-17 21:28:35 78

原创 Leetcode-18:四数之和

个人思路总结:其实我觉得这个题没啥用!,前面都做过三数之和了,这个就等于在三数之和的基础上再加一层循环,现在的程序结构就变为了两层循环+双指针。代码如下:class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { ...

2019-04-17 21:21:23 81

原创 Leetcode-17:电话号码的字母组合

个人思路总结:题意理解:即如果输入两个数字,则全是两个字母组合;如果输入三个数字,则输出全是三个字母组合。采用深度优先搜索(DFS),递归实现。其实DFS也可以用非递归方法实现,即借用栈来实现。代码如下:class Solution {public: vector<string> letterCombinations(string digits) { ...

2019-04-13 17:46:21 582

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除