977.有序数组的平方
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解
双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili
笔记
- 由于数组包含负数,那么平方之后较大的数一定是在数组两端的,平方后数值由大到小的顺序是从数组两端往中间收的,可以使用双指针从两端往中间收,每次比较两个指针位置的值平方后的大小,把大的值存到新数组,对应的指针往内移。
- 题目要求新数组也是非降序,那么存值的时候可以从后往前存,设置一个变量表示新数组的下标。新数组的下标范围和原数组是一样的,那么最大的值就先存到数组的[len(nums)-1]号位置,也就是新数组下标变量的初始值为[len(nums)-1],每存一个值就把下标值减一
Python代码
调用python排序函数sorted,时间复杂度为O(nlogn)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(pow(x, 2) for x in nums)
使用双指针实现,时间复杂度为O(n)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
k = len(nums)-1 #结果数组的下标变量
ans = [0]*len(nums) #结果数组
i, j = 0, len(nums)-1 #左右双指针
while (i <= j): #当i=j,两指针指向最后一个元素的时候,也要进循环
if pow(nums[i], 2) < pow(nums[j], 2):
ans[k] = pow(nums[j], 2)
j -= 1
k -=1
else: #若pow(nums[i], 2) = pow(nums[j], 2),随便移动ij其中一个指针都可
ans[k] = pow(nums[i], 2)
i += 1
k -= 1
return ans
209.长度最小的子数组
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解
拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
笔记
- 看到连续子数组,用双指针
- 要求和,定义一个变量add
- 要返回满足条件的最小子数组长度,维护一个变量ans表示最小长度,每次更新取min,初始化为一个不可能的比较大的值n+1
- 当满足子数组和大于等于target后,移动左指针,把和减去左边的元素,左指针右移,继续循环判断和是否满足条件,直到和不满足条件后出循环,回到外层右指针右移的循环
- 注意处理特殊情况,找不到的时候满足条件子数组的时候返回0
Python代码
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
ans = len(nums) + 1 #满足条件子数组的最小长度,每次取min
add = 0 #子数组和
i = 0
for j in range(len(nums)):
add += nums[j]
while add >= target:
ans = min(ans, j-i+1)
add -= nums[i]
i += 1
return ans if ans != len(nums)+1 else 0
59.螺旋矩阵II
题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频讲解
一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
笔记
- 每次移了边界之后判断,如果边界不符合条件则退出循环
- 不要复制,一个一个的写,复制容易忘记修改导致出错
Python代码
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
left, right = 0, n-1 #列,闭区间
up, down = 0, n-1 #行
matrix = [[0]*n for _ in range(n)]
k = 1
while True:
#从左往右遍历
for i in range(left, right+1):
matrix[up][i] = k
k += 1
up += 1 #上边界下移
if up > down:
break
#从上往下遍历
for i in range(up, down+1):
matrix[i][right] = k
k += 1
right -= 1 #右边界左移
if right < left:
break
#从右往左遍历
for i in range(right,left-1,-1):
matrix[down][i] = k
k += 1
down -= 1 #下边界上移
if down < up:
break
# 从下往上遍历
for i in range(down, up-1, -1):
matrix[i][left] = k
k += 1
left += 1 #左边界右移
if left > right:
break
return matrix