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

977.有序数组的平方;

题目描述:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

注意:这里面的说的非递减就是递增,或者可以相等,像1.1.2.3.4.4。

暴力解法:

将数组内每个数进行平方,在重新进行非递减排序。

双指针法:

原理:由于是非递减数组,里面有可能包含负数,那我们可以让指针从两边取平方(因为越接近零,其平方就越小),两边的平方比较,谁大放进数组的最后面位置。

问题1:为什么不是平方比较之后,谁小放进数组前面位置? 

答:这样没有办法保证,数组是递增排列,因为两头的平方后一定是最大的,但平方不一定整个数组里面最小的,所以只能取大头放进数组最后面。

注意点:

1.while循环条件是a<=b,不要漏掉a=b的条件。

2.if条件要与大括号内的代码实施相对应。取谁,谁对应的指针移动一位。

3.b一开始的取值是nums.size()-1;

 

59.螺旋矩阵

在一开始做的时候,毫无思路,即便已经做过一次。

核心:

1.转的圈数

  • 2.秉持着左闭右开原则

第二点的意思是,在我们给我们的二维数组res(构建的二维数组)赋值时,例如一个3,3矩阵,赋值时,给第一行第一二个赋值就可以,第三个让竖着的时候再赋值,始终保持着所在这一行第一个是被赋值了的,但是最后一个留给下次循环。(也就是留给下一行或者下一列赋值。

原理:小循环是每次赋值一行或者一列,始终坚持着左闭右开的原则。大循环是转的圈数。已经遍历完所有位置,或者只剩最后一个中间元素时,停止循环。

注意点:

保证每次大循环之后,要让初始遍历点往后挪一个位置,终止位置也往前挪一个位置。具体操作:

startx++ ; starty++;  i<n-offest; j<n-offest ; offest+++;中间位置赋值时:如果存在中间位置的话,那就给中间位置坐标为( 2/n, 2/n );

代码:

 

209.长度最小的子数组

核心思路:双指针法。让前后指针相互组成构成一个滑块。

具体操作:先让fast指针向前遍历,直至fast<nums.size(),让sum累加nums[fast], 直到sum>target值,记录此时数组长度,再让sum-=nums[slow],再判断是否符合条件,若符合大于target,那么更新所记录的数组长度,直至slow>fast,也就是说循环条件是slow<=fast。

注意点:

1. 无论是fast还是slow,他们自身++,一定是所有代码都实施完再++。如果先自身++,那么将会漏掉一种可能行。以fast举例,若sum+=nums[fast],使sum>target,满足条件之后,进入判断数组长度的循环之后,因为fast先++,所以我们得出来的长度会比实际值大1。slow同理。

2.由于要更新长度,所以一定要设置一个长度初始值。如果初始长度>当前子数组长度时,那么初始长度将更新为子数组长度。所以注意这里面不能设置成nums.size(),因为当恰好子数组长度等于数组长度时,没办法去分辨result是未被赋值,还是恰好赋值成了数组长度。

3.基本没办法用if else或者if来写。

首先if else的话,那执行完sum加等于的操作之后就不执行后面的了,若加完之后就已经大于target,但是ifelse ,已经不执行后面的了,所以肯定不可以这么去写。

if if的话,因为当sum-=nums[slow]时,可能进行多次操作,但是if循环一次就结束了,就进入下一次大循环了,fast又加加,sum也加nums[fast], 明明之前的长度最短记录还未记录出来,这个值就改变了,所以显然不可以。

 

 


  •  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值