代码随想录刷题60天 第2天

Q1 977. Squares of a Sorted Array

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        i, j = 0, len(nums)-1
        res = []
        while i <= j:
            if abs(nums[i]) >= abs(nums[j]):
                res.append(nums[i]*nums[i])
                i += 1
            else:
                res.append(nums[j]*nums[j])
                j -= 1
                
        res.reverse()
        return res

用时3min;双指针

Q2: 209. Minimum Size Subarray Sum

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        s, t, res = 0, 1, 100001
        cur_sum = nums[0]
        while t < len(nums):
            if cur_sum < target:
                cur_sum += nums[t]
                t += 1
            else:
                res = min(res, t-s)
                cur_sum -= nums[s]
                s += 1
        while cur_sum >= target:
            res = min(res, t-s)
            cur_sum -= nums[s]
            s += 1
            
        return res if res!=100001 else 0

用时17min;要注意的点是还有第二个while循环,第一个循环退出的条件是t < len(nums),这时可能还没有到达最优情况

Q3 59. Spiral Matrix II

第一种解法:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0]*n for _ in range(n)]
        l, r, t, b = 0, n-1,0, n-1
        v = 1
        while l <= r and t <= b:
            for k in range(l, r+1, 1):
                res[t][k] = v
                v += 1
            t += 1
            for k in range(t, b+1, 1):
                res[k][r] = v
                v += 1
            r -= 1
            for k in range(r, l-1, -1):
                res[b][k] = v
                v += 1
            b -= 1
            for k in range(b, t-1, -1):
                res[k][l] = v
                v += 1
            l += 1
        return res
            
    

第二种解法:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        # spiral walk
        res = [[0]*n for _ in range(n)]
        i,j,di,dj = 0,0,0,1
        for k in range(n*n):
            res[i][j] = k+1
            if res[(i+di)%n][(j+dj)%n]:
                di, dj = dj, -di
            i += di
            j += dj
        return res
            
    

用时超过30min;第一种解法更直观,但是个人更喜欢第二种解法,写起来好看更多,这种旋转的结构很适合。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值