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

文章介绍了如何使用双指针技巧解决LeetCode中的两个问题:有序数组的平方,通过比较元素的平方值保持非递减顺序;以及长度最小的子数组,找到数组中和大于等于目标值的最小连续子数组。还讨论了螺旋矩阵生成的算法,按照顺时针顺序填充一个正方形矩阵。

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

有序数组的平方:

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

题目链接:977.有序数组的平方

卡哥的视频链接:双指针法经典题目 | LeetCode:977.有序数组的平方

本题思考:由于给出的数组已经是升序了,所以不需要再排序,但是要返回平方,数组中的负数平方可能会大于正数,所以要用双指针来判断,建立一个新的数组,把重新判断后的数组放进去,新数组的长度和原来的数组一样。

代码示例:

具体逻辑如下:

首先,定义两个指针 left 和 right 分别指向数组的起始位置和末尾位置,同时定义一个新数组 result 用于存放平方后的结果,result数组的大小与原数组相同。

使用双指针的方法,从数组的两端开始遍历,比较左右指针所指元素的平方大小,并将较大的平方值放入 result 数组中。

遍历过程中,采用逆序的方式将平方值放入 result 数组中,因为在原数组中,绝对值较大的元素的平方值可能会比较大,所以需要逆序存放。

遍历完所有元素后,返回 result 数组,即为按非递减顺序排列的每个元素的平方值数组。

小tips:

1.本题用双指针的思想解决了数组内元素平方的排序问题,在while循环条件时,注意别漏掉等于的条件,否则会漏元素

2.注意最开始的取值

3.最终输入新数组的是原数组元素的平方,别忘咯~

leetcode提交记录:

长度最小的子数组:

题目:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

题目链接:209.长度最小的子数组

卡哥的视频链接:拿下滑动窗口! | LeetCode 209 长度最小的子数组

题目思考:相对于两层for循环,一层for循环的索引,用来表示滑动窗口的终止位置。

代码示例:

代码逻辑:

  • leftright 分别表示子数组的左右边界;
  • sum 表示当前子数组的和;
  • result 用于记录满足条件的子数组的最小长度,初始值设为整型最大值,以便后续比较。
  • 遍历数组 nums,每次将当前元素加到 sum 中,并不断更新 right 的值。
  • sum 大于等于 s 时,进入内部的 while 循环:
    • 计算当前子数组的长度 right - left + 1,并更新 result 为当前最小值;
    • 同时,将 sum 减去 nums[left],并将 left 右移一位,缩小子数组的范围。
  • 遍历完数组后,返回 result 的值,若 result 未被更新(即始终为初始值),表示不存在满足条件的子数组,返回 0。

这种方法采用了双指针的思想,在每次移动右指针时,不断调整左指针,以保证子数组的和大于等于给定值 s 的最小长度。

leetcode提交记录:

小tips:计算窗口长度时记得+1。     

螺旋矩阵:   

题目:

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

题目链接:59.螺旋矩阵

卡哥的视频链接:一入循环深似海 | LeetCode:59.螺旋矩阵II

题目思考:从外到内,一圈一圈地填完,注意边界和奇偶数的判断

代码示例:

代码逻辑:

  1. 定义了一个变量 loop 用来控制循环的次数,因为每次循环处理一圈。
  2. 创建了一个二维数组 res 用来存储生成的螺旋矩阵,其大小为 n x n,即一个正方形矩阵。
  3. 定义了一个变量 start 用来记录每一圈的起始位置,初始化为0。
  4. 定义了一个变量 count 用来记录填入的数字,初始化为1。
  5. while 循环中,首先模拟从左到右遍历,然后从上到下遍历,接着从右到左遍历,最后从下到上遍历。这样就完成了一圈的填充。
  6. 每完成一圈的填充,更新 start 的值,相当于将起始位置向右下角移动一格,同时进入下一圈的循环。
  7. 如果 n 为奇数,则需要手动将最中间的位置填入 count 的值。
  8. 最后返回生成的螺旋矩阵 res

leetcode提交记录:

小tips:

1.定义数组的时候别忘了是二维数组

2.第一次和第二次遍历时,i,j的定义是start,别习惯性地打成0

3.注意边界,别重复咯(而且是前两次不等,后两次有等)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值