LeetCode977 有序数组的平方
题目&文章链接:977.有序数组的平方
看到题目的第一想法
看完题目的第一想法当然是用两个for循环,第一个for循环求一下每个元素的平方,第二个for循环用一个快排或者归并、冒泡之类的排序算法,用这思路做出来之后,去看了眼题解,看到了双指针法,想到刚前一天恰巧刚学了双指针法,想当然的用了昨天LeetCode27的思路,当然了是没做出来
看完代码随想录之后的想法
发现本题的双指针法的思路与LeetCode27的思路是完全不同的,虽然都叫双指针法,在本题中,输入数组虽然是一个非递减数组,但是由于存在负数,所以经过平方之后,数组内的元素排列顺序会变成中间小、两边大的情况,所以,两个指针i,j是需要分别在数组的起始位置和终止位置,比较i,j两个位置元素平方后的值的大小,并用一个新的数组来存储,值较大的元素先放入新数组的靠后位置。之后被放入新数组元素的对应指针移动一位。
下面附上随想录中的动图
LeetCode209 长度最小的子数组
题目&文章链接:209.长度最小的子数组
看到题目的第一想法
第一能想出来的方法只有暴力,用费半天劲做出来了,结果超时了。
看完代码随想录之后的想法
解本题可以利用滑动窗口的思想
- 用两个指针i,j,初始化i=j=0,结果记为result=MAXINT,i当作滑动窗口的结束位置,即右端;j作为滑动窗口的起始位置,即左端。
- 让i++,期间记录num[i]至num[j]的和,记作sum,直到sum>=target时i停止++
- 令j开始++,但注意每次j++前都要进行一下几个操作
- 记下当前窗口长度,即i-j+1,记为subLength
- 将result与subLength进行比较,取二者最小值
- 令sum-=nums[j]
直到sum小于target时,j停止++
- 重复2,3操作,直到i到达nums重点位置
滑动窗口
简介
顾名思义,就是有一个大小可变的窗口,左右两端方向一致地向前滑动(右端固定,左端滑动;左端固定,右端滑动).
算法思想
- 在数组中使用双指针中的左右指针技巧,[left,right]称为一个窗口,初始化left=right=0;
- 让先一直让right++,直到窗口中的序列符合条件
- 然后right停止++,让left++,直到窗口内的序列不符合条件为止,同时每次left改变前都更新一轮结果
- 重复2,3步,直到right到数组末端。
LeetCode59 螺旋矩阵Ⅱ
题目&文章链接:59.螺旋矩阵Ⅱ
看到题目的第一想法
说实话有点蒙,要考虑的东西太多了,一共有四个边需要处理,然后还要往里填充,最终一顿分析弄得脑子一团乱麻 突然想起了前一天学到的循环不变量原则,突然感觉思路清晰了不少,可以把每一条线的处理当作一个左闭右开区间每一行每一列都不处理最后一个元素,把最后一个元素当作下次处理的起始元素,最后终于摸索着做了出来。
看完代码随想录之后的想法
发现随想录的思路和我做的差不多,但是更加清晰了,就是每一条边都的处理都要遵循同样的原则,这样才不会乱,比如使用遵循左闭又开的原则时,就是把拐角处让给新的一条边来继续画,如下图所示
代码实现过程中存在着两点需要注意的细节
- 需要有一个offset来控制每次遍历的长度,因为矩阵外层的一圈填充完成后需要往里层填充,此时遍历开始的位置需要加1或减1.
- 当正整数n为奇数时,不要忘了将最里层填充一下,因为当n为奇数时,当代码执行完毕时,会把最里层的位置落下。
实现过程中遇到的困难
LeetCode977
用第一想法做时,遇到的困难就是排序算法的代码实现忘了,用又去复习了一遍快排。 看随想录之前,因为犯了想当然的错误,没有根据题目去分析这么应用双指针法,始终没有做出来。
LeetCode209
主要困难就是看到这种题目时脑子里想不出来除了暴力破解之外的其他方法
LeetCode59
对于每一条边的处理需要考虑的可能太多,脑子很乱,思路很不清晰
今日收获
对双指针法与循环不变量原则的理解更加深刻了。明白了遇到题目时不应该想当然的生搬硬套,要去根据题目分析一下。