一、前言
还是跟着大佬:https://github.com/CyC2018/CS-Notes leetcode题解
顺序来刷的,本篇文章两个题目的主要原理依然是双指针。
二、具体题目
680. 回文字符串
var validPalindrome = function(s) {
let a = 0, b = s.length - 1;
while(a<b){
if(s[a] != s[b]){
if(judgePalindrome(s,a+1,b) == true||judgePalindrome(s,a,b-1) == true){
return true;
}
else{
return false
}
}
else{
a++;
b--;
}
}
return true
};
var judgePalindrome = (s,a,b)=>{
while(a<b){
if(s[a] != s[b]) return false;
else{
a++;
b--;
}
}
return true
}
本题同时也需要用到非常典型的递归思想,这里也顺便整理一下递归的相关知识点。
什么是方法递归?
所谓的方法递归,就是在一个方法(函数)执行的内部,自己调用了自己的过程,称之为 “递归” 。
递归分为两个子过程:
递过程:函数不断地调用自身,直到走到函数的终止条件,第一阶段结束。
归过程:函数不断地返回的过程。
例如,我们求 N! 起始条件:N = 1 的时候,N! 为 1。这个起始条件相当于递归的结束条件。递归公式:求 N!,
直接不好求,可以把问题转换成 N! => N * (N-1)!
(以上内容摘自https://blog.csdn.net/qq_43575801/article/details/124029190)
递归解题三部曲
我们需要关心的主要是以下三点:
- 整个递归的终止条件。
- 一级递归需要做什么?
- 应该返回给上一级的返回值是什么?
因此,也就有了我们解递归题的三部曲:
找整个递归的终止条件:递归应该在什么时候结束? 找返回值:应该给上一级返回什么信息? 本级递归应该做什么:在这一级递归中,应该完成什么任务?
(以上内容摘自https://blog.csdn.net/zwqjoy/article/details/116520425)
88. 归并两个有序数组
本题最值得注意的是:
需要从尾开始遍历,否则在 nums1上归并得到的值会覆盖还未进行归并比较的值。
举个例子,nums1为[1,1,2],nums2为[1,2],如果从头开始遍历,将nums2中的1会覆盖掉nums1中还未进行比较的2。
var merge = function(nums1, m, nums2, n) {
var i = m - 1;
var j = n - 1;
var k = m + n - 1;
while (i >= 0 || j >= 0){
if(i<0){
nums1[k--]=nums2[j--]
}
else if(j<0){
nums1[k--]=nums1[i--]
}
else if(nums1[i]<nums2[j]){
nums1[k--]=nums2[j--]
}
else{
nums1[k--]=nums1[i--]
}
}
return nums1
};
这道题我想要补充一下关于前置递增(递减)和后置递增(递减)的知识点:
1.前置递增(++): 在变量的前面,先自身执行加法操作后在赋值(++i);
2.后置递增(++): 在变量的后面,先赋值后在执行加法操作(i++);
3.前置递减(–): 在变量的前面,先自身执行减法操作后在赋值(–i);
4.后置递减(–): 在变量的前面,先赋值后在执行减法操作(i–);
本题用到了后置递减,即先将nums1[i]或nums2[j]赋值给nums1[k],变量再进行自减。