代码随想录算法训练营第二天|977. 有序数组的平方 209. 长度最小的子数组
977. 有序数组的平方
学习文档:卡哥讲解
学习视频:卡哥讲解
题目简介:
给定一个非递减 的一个数组(包含负数)要求这个数组里面的每个元素平方之后,再进行递增排序。最后返回这个数组。
自己手敲
没敲出来,看了一遍讲解以后
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
#双指针法
left , right ,new_nums = 0,len(nums)-1,[0]*len(nums)
right_newnums = len(nums)-1
while(left <= right ):
if nums[left] **2 > nums[right]**2:
new_nums[right_newnums] = nums[left]**2
left += 1
else:
new_nums[right_newnums] = nums[right]**2
right -=1
right_newnums -= 1
return new_nums
思路:
关键在于当数组两边要么是最大数最小数的时候 ,使用双指针法。
需要再创建一个数组,以存放最大的数字。
双指针 是针对 需要排序的数组,最左边一个指针,最右边一个指针。
通过比较双指针指向的元素的平方大小,大的赋值往前走,小的不走停一停 。
209. 长度最小的子数组
学习文档 :卡哥讲解
学习视频:卡哥讲解
题目简介:
给定一个正整数Target 以及一个全都是正整数的数组,找出一个连续的最小长度区间要求区间里面的数字之和大于等于该Target
学习卡哥视频
- 本质上也是两个指针的操作
- 开始:两个指针都指向数组的第一个元素。一个叫Left ,一个叫Right
- 开始寻找 >= Target ,这里肯定需要一个SUM 变量来累加
- Right往前走 ,走一个加一个,直到**SUM>=Target
- Right停止 ,呼叫Left开始求最小长度。然后Left往前走,走一个SUM减一个 ,然后求min_len 最小长度。在Left走的途中,SUM不满足>=Target 了,Right又往前走,直到SUM>=Target **或者走到头停下来,又开始让Left走。
自己按照理解手敲一遍:
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
Left ,Right,Len_nums = 0,0,len(nums)-1
sum = 0
min_len = float('inf') ##错误1,为什么
while(Right<= Len_nums):
sum += nums[Right]
while(sum >= target):
min_len = min(min_len,Right-Left+1)
sum -= nums[Left]
Left += 1
Right += 1
return min_len if min_len != float('inf') else 0 ## 错误2
错误1:为什么要使用 float(‘inf’)?
- float(‘inf’) 表示 正无穷大,在比较的时候确保可以更新最小的长度
错误2 : 为什么要使用min_len if min_len != float(‘inf’) else 0?
- 因为数组中可能没有相匹配的元素,在返回的时候min_len 可能就没有更新。
59.螺旋矩阵 Ⅱ
学习视频:卡哥讲解
学习文档:卡哥讲解
题目简介:
给一个正整数n ,要求生成一个包含1到 n 2 n^2 n2 所有元素,并且元素按照顺时针进行螺旋排列 到 n × n n\times n n×n的正方形矩阵中。
学习卡哥视频
- 遵循循环不变量(对每一条变的处理规则)的原则
自己按理解手敲一遍:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0
loop, mid = n // 2, n // 2 # 错误1
count = 1
for offset in range(1, loop + 1) :
for i in range(starty, n - offset) :
nums[startx][i] = count
count += 1
for i in range(startx, n - offset) :
nums[i][n - offset] = count
count += 1
for i in range(n - offset, starty, -1) :
nums[n - offset][i] = count
count += 1
for i in range(n - offset, startx, -1) :
nums[i][starty] = count
count += 1
startx += 1
starty += 1
if n % 2 != 0 :
nums[mid][mid] = count #错误2
return nums
循环不变量为左闭右开
错误1:loop = n//2
再求取循环的次数loop 的时候,确保结果是一个整数.
- 错误2:if n % 2 != 0
对于奇数矩阵,最后的中心位置需要单独填充。
数组总结
-
分别学习了二分查找 、移除元素 、有序数组的平方 、长度最小的子数组 、螺旋矩阵Ⅱ
-
分别对应方法 二分查找法、双指针法、双指针法、滑动窗口(双指针)、循环不变量
-
在数组中应当注意循环条件(左闭右开,左闭右闭),注意数组越界。
-
对于新掌握的双指针法有不同的用法
- 用于删除元素,一个快一个慢,操作同一个数组,快的与慢的比较,满足条件慢的才往前走,快的一直走。
- 对于排序 ,再加一个新数组,一个最左一个最右,先比较再赋值再移动 。
- 滑动窗口,两个指针开始都是在最左边 ,然后Right指针一直往右移动,直到满足条件停止。让Left移动,直到Left不满足某种条件,Right又开始移动,直到数组的边界。