Python数组练习打卡第二天

Leetcode977 , Leetcode 209 and Leetcode 59

Leetcode977 打卡:返回数组的平方值组成的新数组,且按非递减序列排序

  • 方法一:暴力解法。遍历平方一遍之后排序

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        #方法一:遍历后排序
        res=[]
        for i in nums:
            res.append(i*i)
        res.sort()
        return res

时间复杂度:O(n+log n) 其中logn是排序的时间复杂度   空间复杂度:O(n)

  • 方法二:双指针。

这道题目中的双指针指左边开头和右边结尾处的两个

  • 左指针:从数组左边开始指
  • 右指针:从数组右边开始指

主要目的是比较两端的元素谁的绝对值更大,将更大的数放入结果数组(res)。在res中逆方向进行。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        #方法二:双指针
        n=len(nums)
        res=[0]*n
        left,right=0,n-1
        i=n-1
        while left<=right:
            if abs(nums[left])>abs(nums[right]):
                res[i]=(nums[left])**2
                left+=1
            else:
                res[i]=(nums[right])**2
                right-=1
            i-=1
        return res

Leetcode209 打卡:找出满足条件的数组

  • 滑动窗口 

滑动窗口是另一种意义上的双指针

  • 左指针:指向满足条件窗口的左边
  • 右指针:指向满足条件窗口的右边

在此窗口内,所有元素之和大于等于目标值时,计算当前窗口的大小,并将左指针继续向右移动,缩小窗口的大小。取满足条件窗口的最小值。当元素之和小于目标值时,右指针向右继续移动。直到左右指针都指向数组末尾。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        total=0
        left=0
        res=float('inf')
        for i in range(len(nums)):
            total += nums[i]
            while total>=target:
                total-=nums[left]
                length=i-left+1
                left+=1
                res=min(res,length)
        return res if res!=float('inf') else 0

Leetcode209 打卡:螺旋数组的放置

  • 用数组的四条边界作为约束条件,逐步将里面的值填满
  • 注意!:在设置数组时犯的错误
    #以下两个二维数组不同
    
    res=[[0]*n for _ in range(n)]#每一行都是独立的,改变单独的值不会影响其他行
    
    res=[[0]*n]*n #相当于是复制的,改变一个的值其他行也会随着变化
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res=[[0]*n for _ in range(n)]
        num=1
        top,left=0,0
        bottom,right=n-1,n-1
        while left<=right and top<=bottom:
            #从左到右排序时
            for i in range(left,right+1):
                res[top][i]=num
                num+=1
            top+=1
            #从上到下排序
            for i in range(top,bottom+1):
                res[i][right]=num
                num+=1
            right-=1
            #从右到左排序
            for i in range(right,left-1,-1):
                res[bottom][i]=num
                num+=1
            bottom-=1
            #从下到上排序
            for i in range(bottom,top-1,-1):
                res[i][left]=num
                num+=1
            left+=1
        return res

总结

这两天的内容是数组,注意数组的地址是连续的。在解决数组的相关问题时,可以利用:

  1. 二分法:针对已经排序的数组。要注意区间闭合问题,左闭右开还是左闭右闭。会影响查找时开始和结束的位置
  2. 双指针法:有快慢指针,两头指针。根据不同的需求考虑用哪一种
  3. 滑动窗口:当所需要的结果是一个区间时,可以利用这个方法。

参考:代码随想录 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值