1. 数组

1.1 二分法

704.二分查找 简单
35.搜索插入位置 简单
34.在排序数组中查找元素的第一个和最后一个位置 中等
69. x的平方 简单
367. 有效的完全平方数 简单

35搜索插入位置:

依然用二分法来做,就算nums中没有目标值,也会因为不满足条件使得left和right最后相等,那么在循环之后判断一下left和right是否相等就知道nums中有没有目标值,相等的话,left就是应该插入的位置。

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

用二分法来做,和普通二分法不同,这个是要找到第一个和最后一个位置,所以要在二分法中当target == nums[middle]时改变一下,可以设置二分法找到target之后,继续二分遍历的方向。 当target == nums[middle],先让返回值=middle,如果向左继续遍历,则让right = middle,如果向右继续遍历,则让left = middle + 1。这样target=middle的情况下循环不会退出,而是一直运行到left = right的时候,但这样能确保middle能经过target的第一个和最后一个位置。

69x的平方(重要)

一直习惯用左闭右开的算法,但是当右开超过了int的范围,就会出问题,所以要注意右开的时候int的范围问题。 int a = INT_MAX + 1;是会出错的 int a = INT_MAX + 2 - 3;也是会出错的 int a = (long)INT_MAX + 2 - 3;就没有问题,先让式子转到long上进行计算,计算完后再隐式转换赋给a

1.2 移除元素

27. 移除元素 简单
26. 删除有序数组中的重复项 简单
283. 移动零 简单
844. 比较含退格的字符串 简单
977. 有序数组的平方 简单

27移除元素

用双指针法,设置left和right两个指针。left指向满足条件的元素的下一个位置,right指向正在遍历的位置。当nums[right] == val的时候,left没有加1,right却继续往前走,这个时候left和right有了差,到时候这个值会在下一个!=val的时候被覆盖掉

26删除有序数组中的重复项

用双指针法,设置left和right两个指针。left指向满足条件的元素的下一个位置,right指向正在便利的位置。当nums[right] != nums[left - 1]时,无重复元素,nums[left - 1] = nums[right],都加1。当=时,有重复元素,只有right++;

28移动零

用双指针法,设置left和right两个指针。left指向满足条件的元素的下一个位置,right指向正在遍历的位置。当nums[right] !=val时,nums[left]和nums[right]交换。当=val时,right++而left不动,此时left和right有了差距,但是能保证left处在满足条件的元素的下一个位置,下一次swap过来的依然是满足条件的

844比较含有退格的字符串

双指针法太麻烦,用模拟法。模拟字符删掉的过程,可以倒序遍历字符串,用stack来装内容最快最省时间

977有组数组的平方

双指针法,right指向最右边的元素,left指向最左边元素,比较两个位置的平方,哪个插入就哪个++—

1.3 长度最小的子数组

209. 长度最小的子数组 中等
904. 水果成篮 中等
76. 最小覆盖子串 困难 未完成

209长度最小的子数组

双指针法,也是滑动窗口法。设定left指向复合条件序列的第一个位置,right指向最后一个位置。不断的判断left和right之间是否满足条件,然后修改left和right的值。虽然for循环里面有一个while,但是复杂度依然是O(n),因为复杂度看的是对一个元素操作的次数,这里对每个元素最多操作一次+和-,应该是2n,所以为O(n)

904水果成篮

滑动窗口法。设定left指向符合条件序列的第一个位置,right指向最后一个位置。用i遍历序列,当fruits[i]不在子序列中的种类中,则窗口往右滑动,从right开始往左找第一个!=fruits[right]的元素,让left=这个元素的后一个(就是为了让窗口右移之后依旧只有两种种类),然后让right=i。继续遍历

1.4 螺旋矩阵

59. 螺旋矩阵 II 中等
54. 螺旋矩阵 中等
剑指 Offer 29. 顺时针打印矩阵 简单

59.54.29.都是一样的

都使用双指针法,或者说多指针法,用left_j和right_j形成左开右开区间,用top_i和bottom_i形成上下开区间。再用i和j遍历游走螺旋矩阵,当j走完最上面那排后,top_i加加,上边界下移;其他的移动也是类似操作。