【代码随想录day2】977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵Ⅱ

977. 有序数组的平方

第一想法:暴力

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        if len(nums)==0:
            return []
        nums = sorted(nums,key = abs)
        for i in range(len(nums)):
            nums[i] = nums[i]**2
        return nums

第二种办法:双指针

同时定义一个新数组result,和nums数组一样的大小,让k指向result数组终止位置

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        if nums is None or len(nums)==0:
            return []
        res = [-1] * len(nums)
        low = 0
        high = len(nums)-1
        k = len(nums)-1
        while(low<=high):
            if(abs(nums[low])<=abs(nums[high])):
                res[k] = nums[high]** 2
                high-=1
            else:
                res[k] = nums[low]** 2
                low+=1
            k-=1
        return res

209. 长度最小的子数组

没想法

滑动窗口方法总结:

实际上可以看成是双指针,两个指针不断的调节子序列的起始位置和终止位置。

自己写的:超出时间限制。可能是因为使用的切片方式算sum。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        low = 0
        res = float("inf")
        for high in range(len(nums)):
            while sum(nums[low:high+1])>=target:
                cur = high+1-low
                res = min(cur,res)
                low += 1
        return 0 if res==float("inf") else res

答案:使用一个sums随时记录窗口内的值

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        low = 0
        res = float("inf")
        sums = 0
        for high in range(len(nums)):
            sums += nums[high]
            while sums>=target:
                suml = high+1-low
                res = min(suml,res)
                sums -= nums[low]
                low += 1
        return 0 if res==float("inf") else res

59. 螺旋矩阵 II

没思路。

太晕了,之后得多看几遍

需要明确循环不变量。

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

左闭右开(看颜色区分!!拐角处让给新的一条边来继续画

 

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                           # 计数1,2,3,4,。。。

        for offset in range(1, loop + 1) :      # 每循环一层偏移量加1,偏移量从1开始
            for j in range(starty,n-offset):
                nums[startx][j] = count    #第一行,j=0不动,横坐标++,左至右
                count += 1
            for i in range(startx,n-offset):#上至下
                nums[i][n-offset] = count
                count += 1
            for j in range(n - offset, starty, -1):
                nums[n-offset][j] = count
                count += 1
            for i in range(n-offset, startx, -1):
                nums[i][starty] = count
                count += 1
            startx += 1#起始点(0,0)经过一个循环之后,变成(1,1)
            starty += 1
        if n%2==1:#循环到最后,中间是否还剩一个值
            nums[mid][mid]=count
        return nums

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值