个人leetcode总结
半路转行程序员
这个作者很懒,什么都没留下…
展开
-
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 · 168 阅读 · 0 评论 -
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 · 152 阅读 · 0 评论 -
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 · 97 阅读 · 0 评论 -
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 · 101 阅读 · 0 评论 -
Leetcode-43:字符串相乘
个人思路总结:其实这个题就是华为经常爱考的大数相乘类型题。==一个数乘以一个数的结果长度必定小于或者等于这个两个数长度之和。==这个是关键点,一定要弄清楚。具体还是看代码吧,较简单。其中有个小关键点,就是最后的int类型转string类型,在c++11中,有to_string(int)这个函数,可以将int转string。代码如下:class Solution {public: ...原创 2019-05-04 17:22:21 · 120 阅读 · 0 评论 -
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 · 94 阅读 · 0 评论 -
Leetcode-41:
个人思路总结:本题要求时间复杂度为O(n),且只能使用常数级别的空间。因此不能先对数组进行排序。遍历一次数组把大于等于1的和小于数组大小的值放到原数组对应位置,然后再遍历一次数组查当前下标是否和值对应,如果不对应那这个下标就是答案,否则遍历完都没出现那么答案就是数组长度加1。代码如下:class Solution {public: int firstMissingPositive...原创 2019-05-04 14:58:37 · 314 阅读 · 0 评论 -
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 · 75 阅读 · 0 评论 -
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 · 81 阅读 · 0 评论 -
Leetcode-23:合并K个排序链表
个人思路总结:本题有两种方法可以实现:(1)分治法(2)利用小顶堆(1)分治法:突然觉得分治法很有哲学思想啊,大事化小,小事化了。跟归并排序的思维一样,不再详细叙述了,直接上代码。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ...原创 2019-04-18 16:33:57 · 103 阅读 · 0 评论 -
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 · 88 阅读 · 0 评论 -
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 · 91 阅读 · 0 评论 -
Leetcode-56:合并区间
个人思路总结:对第一位进行排序,然后根据第二位的大小关系合并。这里在排序时需要注意一下,因为不能直接调用STL中的sort函数,需要自定义比较函数cmp。代码如下:class Solution {public: vector<vector<int>> result; vector<vector<int>> merge(vec...原创 2019-05-20 21:54:05 · 135 阅读 · 0 评论 -
Leetcode-57:插入区间
个人思路总结:可以先用二分法找到插入区间的位置,得到一个新的区间数组,在采用上一题中合并区间一样的做法,区别是省去了排序步骤。注意题目给出一个无重叠的 ,按照区间起始端点排序的区间列表。因此找到插入位置后,我们可以把插入位置前的区间全部插入到目标vector中而不用进行重叠操作(因为它们已经是不重叠的了)。只需考虑插入位置后的重叠操作。代码如下:class Solution {publi...原创 2019-05-21 22:24:28 · 127 阅读 · 0 评论 -
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 · 165 阅读 · 0 评论 -
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 · 191 阅读 · 0 评论 -
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 · 121 阅读 · 0 评论 -
Leetcode-55:跳跃游戏
个人思路总结:它更适合反过来想。我们可以从数组的倒数第二个个元素看起,每次往前遍历,如果当前的元素能够到达最后一个位置,那么我们把当前位置开始到最后全部“切断”,以当前元素为最后一个元素,重复第一次的过程就好了。而最后,如果我们遍历到数组的第一个元素,那么此题返回true,否则,你懂得。代码如下:class Solution {public: bool canJump(vector...原创 2019-05-18 15:43:01 · 146 阅读 · 0 评论 -
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 · 141 阅读 · 0 评论 -
Leetcode-50:Pow(x,n)
个人思路总结:我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。代码如下:class Solution {public: ...原创 2019-05-18 15:29:44 · 204 阅读 · 0 评论 -
Leetcode-49:字母异位词分组
个人思路总结:首先来说说自己的思路,用两层循环,每一次内层循环都得到一个异位词vector(对每一个string都做排序,对排序后的string进行比较,如果相等的话就将其push进vector,如果不一样就跳过)。这个方法的时间复杂度为O(n^2)。因此对于最后一个变态的测试用例没有通过(超时),不过也是写出来记录一下吧。代码如下:class Solution {public: ...原创 2019-05-18 14:11:05 · 168 阅读 · 0 评论 -
Leetcode47:全排列II
个人思路总结:跟46题相比,只需加一步去重即可,我们这里采用set去重。==这里需要注意一下set去重的具体实现方式代码如下:class Solution {public: set<vector<int>> result; vector<vector<int>> permuteUnique(vector<int>&...原创 2019-05-18 13:51:52 · 125 阅读 · 0 评论 -
Leetcode-46:全排列
个人思路总结:这是一道经典的回溯算法题,可以用递归来实现。其实很多人在写递归算法时,总会纠结于每一步递归都是怎么实现的,这样往往容易把自己绕晕。我们只需要关注三件事即可:终止条件、这一步你该做什么以及返回值代码如下:class Solution {public: vector<vector<int>> result; vector<vecto...原创 2019-05-18 13:43:02 · 126 阅读 · 0 评论 -
Leetcode-60:第k个排列
个人思路总结:C++递归解答,根据k和n的值确定string res中每一位的取值。我们知道排列的每一位上都有n种选择,而每一种选择都有(n-1)!种排列方式。因此我们要从左往右依次确认每一位上应该取什么值。判断的方式就是每一位各种选择的排列总数之和是否大于k,一旦大于k,就可以确定此时的那个数字可以作为当前位的数字了。然后删除这个数字,进行下一次递归。代码如下:class Solutio...原创 2019-05-22 22:29:41 · 130 阅读 · 0 评论 -
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 · 178 阅读 · 0 评论 -
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 · 86 阅读 · 0 评论 -
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 · 87 阅读 · 0 评论 -
Leetcode-22:括号生成
个人思路总结:俗话说,任何问题都是可以通过暴力法解决的。我们可以找出所有可能的排序,然后一一比对是否符合规则,但这种方法太低效。==递归回溯法:==只有在我们知道序列仍然保持有效时才添加 ‘(’ 或 ‘)’,而不是像暴力法那样每次添加。我们可以通过跟踪到目前为止放置的左括号和右括号的数目来做到这一点,如果我们还剩一个位置,我们可以开始放一个左括号。 如果它不超过左括号的数量,我们可以放一个右括...原创 2019-04-18 14:06:23 · 79 阅读 · 0 评论 -
Leetcode-15:三数之和
个人思路总结:我们首先对给出的数组进行排序(从小到大)。如果排序后的数组的最左边大于0,可以代表所有的元素都会大于0,因此也就不存在a+b+c=0的情况,此时直接返回空数组即可。同理,如果排序后的数组的最右边小于0,可以代表所有元素都会小于0,因此也可以直接返回空数组。有个小细节就是,如果下一个元素和上一个元素一样大,那么可以直接跳过这次循环,因为不跳过的话最后得到的数组会有重复。代码如下:...原创 2019-04-13 14:41:19 · 73 阅读 · 0 评论 -
Leetcode-14:最长公共前缀
个人思路总结:我们先找出所有字符串的最短长度(因为公共前缀的长度肯定会小于等于该最短长度)。然后依次比较每个字符串的每一个字符。一旦碰到不相等的字符,则直接输出当前公共前缀。(即从下标0开始,判断每一个字符串的下标0,判断是否全部相同。直到遇到不全部相同的下标)代码如下:class Solution {public: string longestCommonPrefix(vecto...原创 2019-03-31 21:44:19 · 84 阅读 · 0 评论 -
Leetcode-13:罗马数字转整数
个人思路总结:建立一个哈希表(其实在C++里面就是map容器),将符号和对应的数值一一映射到哈希表中(key为字符,value为数值)。然后对输入字符串一一从左往右遍历,如果当前字符对应的数值小于其右边字符对应的数值,则用当前结果减去该数值。否则,加上该数值。代码如下:class Solution {public: int romanToInt(string s) { ...原创 2019-03-31 20:31:36 · 84 阅读 · 0 评论 -
Leetcode-12:整数转罗马数字
个人思路总结:如果一一按照区间进行条件判断未免会过于复杂。因此我们分别对每个区间边界值及其对应的罗马数字建立数组。然后从大到小依次与待转换数字比较。代码如下:class Solution {public: string intToRoman(int num) { int num_range[] = {1000,900,500,400,100,90,50,40,10,...原创 2019-03-31 20:06:22 · 84 阅读 · 0 评论 -
Leetcode-11:盛最多水的容器
个人思路总结:采用双指针我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。 此外,我们会使用变量 maxarea 来持续存储到目前为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较长线段那端移动一步。why?最初我们考虑由最外围两条线段构成的区域。现在,为了使面积最大化,我们需要考虑更长的两条线...原创 2019-03-30 15:05:50 · 86 阅读 · 0 评论 -
Leetcode-9:回文数
个人思路总结:注意,当该数是负数时,肯定不是回文数,因此只需对正数进行判断即可。我的思路是建立一个vector,依次将各数字存放进vector内,然后对vector从左到右和从右到左一起往中间遍历,每次判断两个元素是否相等,若相等则继续两头一起往中间走,直至左边index大于右边index,则遍历结束。如果均相等,则是回文数。如果有一个不相等,则不是回文数。代码如下:class Solut...原创 2019-03-30 14:58:20 · 81 阅读 · 0 评论 -
Leetcode-7:整数反转
个人思路总结:本题有个大坑,就是在反转之后,数目可能会溢出(因为题目给的是32位有符号整形)因此我们在定义结果变量的时候,可以把它定义为long型,最后再将其转换为int型输出。如果不做此步处理,可能会导致错误的结果代码如下:class Solution {public: int reverse(int x) { if(x>pow(2,31)-1 || x&...原创 2019-03-30 14:50:38 · 142 阅读 · 0 评论 -
Leetcode-6:Z字形变换
个人思路总结:按照与逐行读取 Z 字形图案相同的顺序访问字符串。首先访问 行 0 中的所有字符,接着访问 行 1,然后 行 2,依此类推…1、第0行的元素的下标为k*(2numRows-2)2、第numRows-1行的元素的下标为(numRows-1)+k(2numRows-2)3、中间第i行的元素为k(2numRows-2)+i和(k+1)(2*numRows-2)-i(其中k代表竖...原创 2019-03-30 14:44:10 · 78 阅读 · 0 评论 -
Leetcode-5:最长回文子串
个人思路总结:这道题是一道很简单的DP问题设dp[j][i]表示字符串中从第j个字符到第i个字符是否为回文串,状态转移方程如下:dp[j][i]为true时表示索引j到索引i形成的子串为回文子串,且子串起点索引为j,长度为i - j + 1。算法时间复杂度为O(N ^ 2)class Solution {public: string longestPalindrome(str...原创 2019-03-30 14:26:57 · 87 阅读 · 0 评论 -
Leetcode-3:无重复字符的最长子串
个人思路总结:本题的关键是要建立一个vector< int > vec(128,-1)。为什么要这么建立呢?因为字符串的每个字符为char类型,可以用int[128]表示其ASCII码我们依次对字符串进行遍历,然后依次计算当前最长不重复子串的左index和右index,然后即可得到无重复字符的最子串的长度。代码如下:class Solution {public: in...原创 2019-03-30 14:12:35 · 100 阅读 · 0 评论 -
Leetcode-2:两数相加
个人思路总结:1、从题目中可以看出会给你两个单链表,然后把他们对应的每个节点的元素相加,若有进位,则向下一个节点进位。2、我们可以建立一个新链表,把两个链表相加的结果放到新链表上。对两个单链表每次均取下一个节点,然后取出它们的value相加,并且判断是否有进位。如果某个链表已经遍历完,而另一个链表还没有遍历完,则把该链表直接放到结果链表的后面。注意对于临时节点的建立,因为每次节点都需要向后走...原创 2019-03-30 14:12:50 · 112 阅读 · 0 评论 -
Leetcode-16:最接近的三数之和
个人思路总结:跟第15题一样,也是先对数组进行排序(从小到大)。然后遍历,采用双指针,时间复杂度o(n^2)代码如下:class Solution {public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); ...原创 2019-04-13 17:36:26 · 75 阅读 · 0 评论