有序数组的平方,非递减排序
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为[16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
第一种解法:先全部平方,然后按照数组排序的方法进行排序
class solution:
def numsquare(self,nums:List[int])->List[int]:
for i in range(len(nums)):
nums[i] =nums[i]**2
nums.sort()
return nums
第二种解法:利用双指针
思路:这里可以引入一个新的数组来存放平方后的元素,采用双指针的方法https://www.programmercarl.com/
def numsquare2(self, nums: List[int],result:List[int]) -> List[int]:
start,end,k=0,len(nums)-1,len(nums)-1
while start < end:
S=nums[start]**2
E=nums[end]**2
if E>S:
result[k]=E
end-=1
k-=1
else:
result[k]=S
start+=1
k-=1
return result
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例: 输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
第一种:暴力解法
思路:找到长度最小的连续子数组,先考虑一个元素单独、两个元素相加的情况,如果没有则扩大长度
class solution:
def minSubArray(self, s: int, nums: List[int]) -> List[int]:
sum,l=0,1
while l<=len(nums):
for i in range(len(nums)-l+1):
for j in range(i,i+l):
sum+=nums[j]
if sum>=s:
return nums[j-1:j+l-1],l
else:
sum=0
l+=1
if l>len(nums): return 0,0
第二种:滑动窗口
思路:使用滑动窗口的方法,用两个指针,一个表示起始位置,一个表示终止位置,起始位置和终止位置之间为窗口,找到窗口内元素的和>=s的情况,直到两个指针距离最近先找出符合条件的连续子数组,即长度最小的连续子数组
def minSubArray2(self, s: int, nums: List[int]) -> List[int]:
start,end,bestl,sum=0,0,len(nums),0
t=len(nums)+1
while start <len(nums) and end<len(nums):
sum=nums[start]+nums[end]
while sum>=s: # 则缩小窗口
l=end-start+1
if l<bestl:
bestl=l
sum-=nums[start]
start+=1
end+=1
#return 0, 0
return nums[start - 1:end], bestl if bestl !=t else 0, 0
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
要遵循循环不变量原则,一直左闭右开,一圈一圈画下去【需要花时间再整理下思路】
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 # 迭代次数、n为奇数时,矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从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为奇数时,填充中心点
nums[mid][mid] = count
return nums
- 用时:4小时