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. 借助多个指针往往能减少很多次遍历

 

posted @ 2023-03-16 19:51  blueCP1999  阅读(33)  评论(0)    收藏  举报