代码随想录训练营day2

文章讨论了两种使用双指针技术解决数组问题的方法。第一种是对于非递减数组的平方操作,通过双指针避免了排序,保持了非递减顺序。第二种是寻找和小于等于给定值s的最小连续子数组,利用滑动窗口的概念动态调整窗口大小以找到满足条件的最小子数组长度。这两种方法都优化了时间复杂度,避免了暴力遍历的效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有序数组的平方

题目描述:

一个非递减数组nums,返回每个数字平方的新数组,也要求非递减。

个人刚开始思路:先把数组中的每个元素平方在快速排序,跟卡哥的思路一样;这样的结果

时间复杂度是:O(log(n )+n),快排logn+遍历变成平方n

也就是暴力排序:

e618982d5bfe44b28d8ba2d6fbec1a3a.jpg

题解指出:因为新数组也是非递减的,新元素来自于原数组最大的元素或者原数组最小的元素(负数最小,平方可能就是最大);

所以用双指针法i、j,i指向数组最左边(也就是最小元素),j指向数组最右边(也就是最大元素),在用k指针指向result数组终止位置(卡哥给的是k指向新数组终止位置,然后递减忘前遍历,这里我想试试k指向新数组起始位置然后递增,一会试验结果)

核心代码如下:6~13行

14b55b0f7c0148d383b4680c3b357a09.jpg

 此题相对简单,猜测有进阶版本;

力扣题目209 长度最小的子数组

描述:一个含有n个正整数的数组,和一个正整数s,找出该数组中其和>=s的最小连续子数组,并返回其长度。如果没有符合的,返回0。

个人思路:暴力法:两层for循环,一层遍历数组,一层得到连续子数组之和在此比较,然后得出结果。时间复杂度:O(n*2);此种解法时间复杂度太高,可以改进用一层for循环解决,所以引出双指针法。

cedcc5c0d025472aa1d51355627d74e5.jpg

卡哥思路:双指针法(滑动窗口)

求最小连续子数组,还是一层for循环 ,然后不断调整窗口位置(保证内部符合题目要求);

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

精髓代码:  sum -=nums[i++];

ac70afb3c1e14725bf193dbac7c057be.jpg

 具体细节如9行的让数组累加;

13行的result语法

14行的精髓代码,这里是已经找到符合的连续子序列,但不一定是最小的,所以通过动态变化来寻找到最小的。

最小:体现在起始指针要遍历完数组找到;连续也是

此题需要多多复习!是一道理解双指针的好题。

()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值