前言
刷题的第二天,准确来说是第三天了,因为已经过了十二点。今天有点拖延,直到下午才学,所以没有看拓展题。刷题时也没能静下心来,但好歹还是完成了基本任务。
还是有些基本语法没熟悉,比如python的定义数组等
977.有序数组
思路:因为昨天学了双指针,所以今天这道题就直接用双指针做出来了。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l=0
r=len(nums)-1
i=len(nums)-1
res=[float('inf')]*len(nums)#数组定义方式
while l<=r:
if nums[l]**2<nums[r]**2:
res[i]=nums[r]**2
r-=1
else:
res[i]=nums[l]**2
l+=1
i-=1
return res
注意:
- res的定义方式,内部数据类型,长度
- 指针定义在两端是因为,使得平方的最大值一定在两端而不在中间,因为原先就是有序数组
- while l<=r是因为要把数组所有元素都遍历完
- https://code-thinking.cdn.bcebos.com/gifs/977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.gif
209.长度最小的子数组
思路:暴力算法超时
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
min_len = float('inf')
for i in range(l):
cur_sum = 0
for j in range(i, l):
cur_sum += nums[j]
if cur_sum >= s:
min_len = min(min_len, j - i + 1)
break
return min_len if min_len != float('inf') else 0#全新写法值得注意,如果min_len无限制
#则表示全部加起来都比s小,故返回0
滑动窗口(其实也是双指针)
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
l = len(nums)
min_len = float('inf')
start=0
end=0
cur_sum=0
while end<l:
cur_sum+=nums[end]
while cur_sum>=target:
min_len=min(end-start+1,min_len)
cur_sum-=nums[start]
start+=1
end+=1
return min_len if min_len!=float('inf') else 0#注意是返回min_len
总结:主要看起始位置start的位置是如何移动的,O(n^2)暴力解法降为O(n)
59.螺旋矩阵II
思路:确定循环不变量
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums=[[0]*n for _ in range(n)]#创建一个n行n列的数组
startx=0#起始点
starty=0
count=1#用来给每一个空格赋值
for offset in range(1,(n//2)+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:#n为奇数时,n的平方为中心点,也为数组的中间的中间位置
nums[n//2][n//2]=n**2
return nums
举例子:注:横为x,纵为y
n=3,第一个for,【【1,2,0】,【0,0,0】,【0,0,0】】
第二个for,offset=1【【1,2,3】【0,0,4】【0,0,0】】,之后依次类推
而求解本题依然是要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
注意n为奇数的情况