day2 | 977.有序数组的平方,209.长度最小的子数组
977.有序数组的平方
题目简述
给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
思路
1. 创建一个空列表res_new,用以接受比较的结果
2. 再创建一个列表res,按原顺序接收原列表中元素的平方值
3. 利用双指针,一个左指针一开始指向列表res的0位置,一个右指针一开始指向n-1位置,n为数组长度
4. 比较两个指针所指的值的大小,把较大的那个值放入列表res_new的最前端,对应的left或者right指针向中心移动一位
5. 遍历列表,直至left大于right,返回结果res_new
class Solution: def sortedSquares(self, nums: List[int]) -> List[int]: res=[] for i in range(len(nums)): res.append(nums[i]*nums[i]) res_new=[] left=0 right=len(nums)-1 while(left<=right): if res[left]<=res[right]: res_new.insert(0,res[right]) right-=1 else: res_new.insert(0,res[left]) left+=1 return res_new
进阶
要求时间复杂度为O(n)
思路
1. 还是双指针为主,然后外加一个指针,res_new初始大小也不在是0,而是n
2. 让外加的那个指针指向res_new的最后一位,这样就不用用insert()函数去遍历了
class Solution: def sortedSquares(self, nums: List[int]) -> List[int]: res=[] for i in range(len(nums)): res.append(nums[i]*nums[i]) res_new=[-1]*len(nums) left=0 right=len(nums)-1 site=len(nums)-1 while(left<=right): if res[left]<=res[right]: res_new[site]=res[right] right-=1 else: res_new[site]=res[left] left+=1 site-=1 return res_new
209.长度最小的子数组
题目简述
给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和 大于等于 target 的长度最小的连续子数组,并返回其长度,如果不存在符合条件的子数组,返回0。
思路
利用两个指针实现,貌似也称之为滑动窗口
1. 定义两个指针,左指针和右指针,但是他们的起始位置都是在0位置处,也即指向列表的第一个数
2. 定义变量res作为输出值,初始值为n+1,如果最后还没变,还是n+1,那么意味着列表中的所有数加到一起都小于target,改为return 0。
3. 利用sum存储从left到right(不包括right所值向的数)的数的和。
4. 如果sum大于等于target,那么用变量lenth接受此时子数组长度,和res比较,取二者较小的那一个
5. 随后sum减去最左边的那个数,left加1
6. 如果sum小于target,我们求和,然后right+1。此时target存的从left到right-1的数的和,因为在求和的代码下面紧跟了一句right+1。这里有个条件,当right==n时就已经超出界限了,只有一种情况会导致right出界,那就是所有数加起来都不够target,于是直接break语句跳出循环返回。
实现代码如下:
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: lenth = 0 n = len(nums) left = 0 right = 0 sum = 0 res = n + 1 # 当res输出值为n+1,则表明所有数加起来都不够 while (left < n): if sum < target: if right == n: break sum += nums[right] right += 1 if sum >= target: lenth = right - left res = min(res, lenth) sum-=nums[left] left+=1 if res == n + 1: return 0 else: return res
总结
1. 双指针的用途或者说指针的用途还蛮广的
2. 借助多个指针往往能减少很多次遍历

浙公网安备 33010602011771号