代码随想录训练营Day2:977有序数组的平方、209长度最小的子数组、59螺旋矩阵||

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++)都写成这样。

今日总结

今天前两道复习了双指针法,最后一道螺旋矩阵还是挺复杂的,要动手画一画。今日大概花费三小时,还是可以,以后可以早上刷题,以便于集中注意力。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值