力扣python刷题day02|LeetCode997、209、59
LeetCode997:有序数组的平方
题目
给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
来源:力扣(LeetCode)
链接:997.有序数组的平方
示例2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
方法一:双指针法(推荐)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l,r,i=0,len(nums)-1,len(nums)-1
res=[0]*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
方法二:暴力排序法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
nums[i] *= nums[i]
nums.sort()
return nums
方法三:暴力排序法+列表推导法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
return sorted(x*x for x in nums)
知识点:双指针法
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,l指向起始位置,r指向终止位置。
LeetCode209:长度最小的子数组
题目
来源:力扣(LeetCode)
链接:209. 长度最小的子数组
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
提示:
方法一:滑动窗口法(推荐)
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
l = len(nums)
left = 0
right = 0
min_len = float('inf')
cur_sum = 0 #当前的累加值
while right < l:
cur_sum += nums[right]
while cur_sum >= target: # 当前累加值大于目标值
min_len = min(min_len, right - left + 1)
cur_sum -= nums[left]
left += 1
right += 1
return min_len if min_len != float('inf') else 0
方法二:暴力法
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
LeetCode59:螺旋矩阵II
题目
来源:力扣(LeetCode)
链接:59. 螺旋矩阵II
示例1 :
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
方法:
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
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
return nums
思路:
用了二分法,遵循左闭右开原则
模拟顺时针画矩形的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上