一句话题解——Leetcode-cn

#1、两数之和(easy):使用map进行查找即可。

#2、两数相加(normal):链表模拟大整数加法。

#3、无重复字符的最长子串(normal):

  标记数组与双指针,数组存放该字符是否在所查找区间内出现,双指针搜索最长的区间。

  右指针向后搜,发现当前字符已经出现,则不断将左指针右移至与右指针指向字符相同的字符后一位,并且不断更新标记数组。

  移动左指针至目标点后更新区间最大值即可。

#5、最长回文子串(normal):经典马拉车(Manacher)问题。

#6、Z字形变换(normal):普通模拟带一般复杂的计算。

#7、整数反转(easy):普通模拟加边界判断,很巧妙。

#9、回文数(easy):判断是不是回文数,没啥好说的。

#11、盛最多水的容器(normal):贪心+双指针。每次计算盛水量后,将短板指针向左(或右)移动一次,继续计算盛水量。

扫描二维码关注公众号,回复: 9265418 查看本文章

#12、整数转罗马数字(normal):贪心。每次减去小于这个数的最大面值并更新字符串即可。

#13、罗马数字转整数(easy):模拟。从右向左遍历字符串,遇到左比右小的情况就减去对应值,否则加上对应值即可。

#14、最长公共前缀(easy):和GCD一样,公共前缀也具有传递性,先得到两个串前缀,再将公共前缀分别向后与其他字符串计算,每次更新即可。

#15、三数之和(normal):

  双指针。将数组排序后,固定一个数字 nums[i] ,然后双指针分别在 i+1 和 length-1 处。

  如果三数和大于0,即右指针左移,小于0左指针右移,等于零两指针都移动,并更新答案。

  注意的是,每次移动指针都是持续移动直到一个不等于移动指针前指向的数字出现。

#16、最接近的三数之和(normal):与#15思路几乎相同。

#17、电话号码的字母组合(normal):使用广搜思想搜索全部答案即可。

#20、有效的括号(easy):简单栈模拟,注意判空。

#26、删除排序数组中的重复项(easy):双指针。一个指向当前应被确定的位置last,一个从左向右遍历,遇到两指针不相等时则移动last指针即可实现原地修改。

#27、移除元素(easy):与#26双指针设定相同,遇到不等于val的指针,就更新last指针并右移last。

#28、实现strStr(easy):简单KMP求子串位置。

#31、下一个排列(normal):

  经典排列算法。

  从右往左找到是否存在nums[i]>nums[i-1],若不存在则说明当前排列为最后一个排列。

  如果找到满足上述要求的 i ,则排序区间 [i,n-1] 。

  然后在新的区间 [i,n-1] 内从左至右找到一个比 nums[i-1] 大的数字 nums[j] 并交换这两个数字,然后跳出此循环。

  这样就得到了整个数组的下一个排列。

#35、搜索插入位置(easy):找到一个索引 i 使得 nums[i]>target 即可。

#45、跳跃游戏II(hard):

  贪心(没证出来)。

  循环从0到n-2,每次维护当前点能跳到的最远点作为一个极值maxx。

  如果边界指针和循环指针相等则更新边界指针至maxx,并且计数器加一。

#46、全排列(normal):算法详见#31,此题直接调用#31的算法就行了。

#48、旋转图像(normal):原地算法将方阵顺时针旋转90度,计算有点费脑,但是不难。

#50、Pow(x,n)(normal):快速幂0ms通过。

#53、最大子序和(easy):经典DP。dp[i] = max(dp[i-1],0) + nums[i]。

#60、第k个排列(normal):直接调用#31的算法会比较慢,最好使用数学方法求解。

#64、最小路径和(normal):简单DP。dp[i][j] = min(dp[i-1][j],dp[i][j-1])。

#72、编辑距离(hard):

  经典DP。

  首先初始化,dp[i][0] = dp[0][i] = i。

  如果 word1[i-1]==word2[j-1],则 dp[i][j] = dp[i-1][j-1]。(无编辑距离)

  否则,dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]。(依次为替换,删除,增添)

  计算得到的 dp[n][m] 即为答案。

#73、矩阵置零(normal):

  先使用两个标记记录第0行与第0列是否应该置零。

  再使用第0行(与第0列)标记该行(列)是否应该置零。

  最后根据标记依次置零即可完成原地算法。有趣。

#74、搜索二维矩阵(normal):简单二分查找即可。

#75、颜色分类(normal):使用三个标记维护0,1,2的出现次数,然后清空vector再根据标记填写即可。

#77、组合(normal):最好还是递归,二进制枚举耗费时间过长。

#120、三角形最小路径和(normal):经典DP。从下向上,dp[i][j] += min(dp[i+1][j],dp[i+1][j+1])。dp[0][0]即为答案。

#136、只出现一次的数字(easy):直接求异或和即可。

#139、单词拆分(normal):

  可以用DP思想来看。

  假设 i 和 j 为两个索引且 i < j。

  那令 dp[j] = true 的条件应该是 dp[i] = true 并且从 i 到 j 构成的子串在字典中。

  所以这道题需要遍历出所有的子串,如果子串出现在字典中并且 dp[i] = true,则更新 dp[j] 为 true。

  最后 dp[n] 即为答案。

#260、只出现一次的数字III(normal):

  算法很多,我的算法适用于不存放只读入数组但不存放数组的情况。

  先求出全部数字的异或和。

  再建立 logn 级别的数组 vis[] 存放这一位是 1 的全部数字的异或和。

  最后vis里只会出现4种值,两种为要找到的数字,另外两种为所有数字的异或和,还有0。

  然后利用所求出的异或和扫一遍 vis[] 即可。

猜你喜欢

转载自www.cnblogs.com/love-fromAtoZ/p/12331360.html