代码随想录算法训练营Day 02| 数组part02| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
文章目录
907.有序数组的平方
一、规矩的双指针
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
l = 0 #左指针
r = len(nums)-1 #右指针
k = len(nums)-1 #新列表的更新指针
res = [0]*len(nums) #存放结果的列表(一定要新建立一个列表)
while(l<=r): #注意这里要i <= j,因为最后i=j的元素也要放在新数组里
if nums[l]**2>nums[r]**2:
res[k] = nums[l]**2
k -=1
l +=1
else:
res[k] = nums[r]**2
k -=1
r -= 1
return res
注意本题的特性是由左右往中间减小,所以双指针指向头尾。循环的条件是i<=j,等号不能省略,且不能将更新放在原数组。
二、美好的暴力解法
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
#暴力
return sorted(x*x for x in nums)
三、本题总结
这道题第一眼看不会,看了一遍视频后,双指针的方法印象很深刻了。之前写了两次都忘记重新定义新的结果存放数组,希望以后不要再犯一样的错误了。
209.长度最小的子数组
一、滑动窗口初见
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
i = 0
sum = 0
minlen = float('inf')
for j in range(len(nums)):
sum += nums[j]
while(sum>=target):
minlen = min(minlen, j-i+1) #先更新长度
sum -= nums[i]
i += 1
return 0 if minlen==float('inf') else minlen
这是第一次接触滑动窗口的题目,方针就是大了左指针右移,小了右指针右移,然后在每次满足target条件后更新长度,再移动左指针。
二、怎么写都超时的暴力解法
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
#暴力解法
minlen = float('inf')
for i in range(len(nums)):
sum = 0
for j in range(i,len(nums)):
sum +=nums[j]
if sum>=target:
minlen = min(minlen,j-i+1)
break #加break都超时
return 0 if minlen==float('inf') else minlen
三、本题总结
老老实实写滑动窗口吧!
59.螺旋矩阵II
一、不涉及算法 纯写
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
matrix = [[0]*n for _ in range(n)]
loop = n/2 #圈数
startx,starty = 0,0 #每圈的起点
bias = 1
count = 1
while loop:
# 每一圈从(startx,starty)开始,每一条边都是左闭右开,需要考虑每条边的起始点表达
for i in range(starty,n-bias):
matrix[startx][i] = count
count +=1
for j in range(startx,n-bias):
matrix[j][n-bias] = count
count +=1
for i in range(n-bias,starty,-1):
matrix[n-bias][i] =count
count +=1
for j in range(n-bias,startx,-1):
matrix[j][startx] = count
count +=1
loop -=1
startx +=1
starty +=1
bias +=1
#加n为奇数的判断
if n%2 ==1:
matrix[n/2][n/2]=n*n
return matrix
这个题目主要是搞清楚边界条件,都用左闭右开的形式,这样就可以保证每条边不会重叠,然后看内部的for循环其实就是几个边界点的排列组合,还算是比较简单的。
二、本题总结
有空把剩下几道螺旋矩阵也给做做吧!你这代码能力,哎!