1.有序数组的平方:
1.for循环中的条件为何是i<=j而不是i<j?因为有可能当i=j时左右两指针都同时指向一个数,i<=j时则可遍历到这个数组中的数,而i<j则漏掉了此数。
2.在else中包含了i<j和i=j的情况,若nums【i】=nums【j】,将最右端的元素nums【j】的平方加到新数组后,j--,i不变,由于原数组是递增排列,平方的最大值只会在数组左右两端,故在下次循环的过程中nums【i】的平方也会加入到新数组中。不必的担心数组元素平方相等的问题。
3.新数组要通过下标k来重新排列数组顺序。
2.长度最小子数组:
1.若遍历的是窗口的起始位置,则终止位置也要遍历完起始窗口后所有位置,与暴力解法没有差别,故遍历的只能是终止位置,窗口的起始位置跟着终止位置调整。
2.for循环遍历更新窗口终止位置,while循环根据窗口中的和更新起始位置。
3.i变化的规律为只要sum的值>=target 则i+1,也即是while循环的条件
4.在改变窗口起始值的时候为何不用if要用while?这个可以用一个1,1,1,1,100;target=100来自己模拟一下,只有while循环能够满足条件。
总结:这些题目我都是先看了卡哥的题解再自己默写,此题我容易忘记的点还在于result在每个while循环中要不断地更新
螺旋矩阵II:
一个新的想法:每次在背代码的时候,我总是想提前把变量都定义好,但有时侯变量太多的情况下一下子记不住,所以可以先把核心逻辑代码写出来,在写核心代码的时候发现缺什么变量再补在前面。
1.最重要的是保持变量一致性,保持左闭右开则每一条边都要保持左闭右开的原则(即处理每一条边的时候最后角上的元素不处理,留着处理下条边的时候一并处理)如上图各个颜色所示。
2.就是坐标的问题,可以理解为i代表是二维数组中哪一个数组,j为个数组中每个元素的位置。且以左上角为原点。向右j递增,向下i递增。
3.要关注每一次while循环之后startx(循环完一周后每次新循环时遍历的起点i的值)、starty(循环完一周后每次新循环时遍历的起点j的值)、setoff(),这三个变量的变化及含义。
4.在while循环中,要提前定义i和j,因为后面的for循环都要用,但是不能在for循环中重新定义(int i = )或者int(j = )这样的话相当于是在for循环中重新定义了一个新的变量,之后就会报错。 所以四个for循环中都不用重新定义i,j直接打分号就好。不用像卡哥写的代码那样。
for( ; i < n-offset; i++)都写成这样。
今日总结:
今天前两道复习了双指针法,最后一道螺旋矩阵还是挺复杂的,要动手画一画。今日大概花费三小时,还是可以,以后可以早上刷题,以便于集中注意力。