有序数组的平方:
题目:给你一个按 非递减顺序 排序的整数数组 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循环的索引,用来表示滑动窗口的终止位置。
代码示例:
代码逻辑:
left
、right
分别表示子数组的左右边界;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
题目思考:从外到内,一圈一圈地填完,注意边界和奇偶数的判断
代码示例:
代码逻辑:
- 定义了一个变量
loop
用来控制循环的次数,因为每次循环处理一圈。 - 创建了一个二维数组
res
用来存储生成的螺旋矩阵,其大小为n x n
,即一个正方形矩阵。 - 定义了一个变量
start
用来记录每一圈的起始位置,初始化为0。 - 定义了一个变量
count
用来记录填入的数字,初始化为1。 - 在
while
循环中,首先模拟从左到右遍历,然后从上到下遍历,接着从右到左遍历,最后从下到上遍历。这样就完成了一圈的填充。 - 每完成一圈的填充,更新
start
的值,相当于将起始位置向右下角移动一格,同时进入下一圈的循环。 - 如果
n
为奇数,则需要手动将最中间的位置填入count
的值。 - 最后返回生成的螺旋矩阵
res
。
leetcode提交记录:
小tips:
1.定义数组的时候别忘了是二维数组
2.第一次和第二次遍历时,i,j的定义是start,别习惯性地打成0
3.注意边界,别重复咯(而且是前两次不等,后两次有等)