977有序数组的平方
977. 有序数组的平方 - 力扣(LeetCode)
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
- 输入:nums = [-4,-1,0,3,10]
- 输出:[0,1,9,16,100]
- 解释:平方后,数组变为 [16,1,0,9,100]
- 排序后,数组变为 [0,1,9,16,100]
示例 2: - 输入:nums = [-7,-3,2,3,11]
- 输出:[4,9,9,49,121]
解题思路:
1. 暴力求解:map对list元素求平方,转list后,sorted
2. 双指针:构建与nums等长列表res,left,right指针分别指向nums首尾,对比收尾元素平方值,将较大值填入res尾部,其res尾部指针前移一位
import copy
class Solution():
# 暴力求解
def sortedSquares(nums):
a = sorted(list(map(lambda x: pow(x,2),nums)))
return a
# 双指针
def sortedSquares(self,nums):
left,right = 0, len(nums)-1
res = copy.deepcopy(nums)
for k in range(len(nums)-1,-1,-1):
if nums[left]**2 > nums[right]**2:
res[k] = nums[left]**2
left += 1
else:
res[k] = nums[right]**2
right -= 1
return res
def sortedSquares(self,nums):
left,right,k = 0,len(nums)-1,len(nums)-1
res = copy.deepcopy(nums)
while left<=right:
if nums[left]**2 > nums[right]**2:
res[k]=nums[left]**2
left += 1
else:
res[k]=nums[right]**2
right -= 1
k -= 1
return res
209.长度最小的子数组
209. 长度最小的子数组 - 力扣(LeetCode)
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 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
解题思路:
1. 暴力求解:双层循环,每层额外判断当前元素是否>target,满足return 1
2. 滑动窗口:构建快慢指针,快指针先走,元素和 $res>target$ 时,快指针停止移动,慢指针逐步前移直到 $res<target$ , 在此过程计算length
class Solution():
def minSubArrayLen(target,nums):
slow,length,res = 0,float("inf"),0
for fast in range(len(nums)):
res += nums[fast]
while res>=target:
length = min(length,fast-slow+1)
res -= nums[slow]
slow += 1
return 0 if length==float("inf") else length
59.螺旋矩阵Ⅱ
59. 螺旋矩阵 II - 力扣(LeetCode)
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
- 输入:n = 3
- 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2: - 输入:n = 1
- 输出:[[1]]
解题思路:
设定循环轮数:loop=n//2(转圈数)
设定右边界缺失数:offset(左闭右开)
设定行、列起始值:start_x,start_y
从左到右(column<n-offset)、从上到下(row<n-offset)、从右到左(column>start_y)、从下到上(row>start_y)依次循环
n为奇数时中心点为n*n
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0]*n for _ in range(n)]
loop = n//2
start_x,start_y = 0,0
count,offset = 1,1
while loop:
row,column=start_x,start_y
while column<n-offset: # 从左到右
nums[row][column]=count
count+=1
column+=1
while row<n-offset: # 从上到下
nums[row][column]=count
count+=1
row+=1
offset += 1
while column>start_y: # 从右到左
nums[row][column]=count
count+=1
column-=1
start_y+=1
while row>start_x: # 从下到上
nums[row][column]=count
count+=1
row-=1
start_x+=1
loop-=1
if n%2:
nums[n//2][n//2]=count
return nums