代码随想录算法训练营2day-python| 977. 有序数组的平方、2209. 长度最小的子数组、59. 螺旋矩阵 II

一、977.有序数组的平方

思路:使用暴力解法的话,for循环平方后再直接排序。双指针的话,有序递增数组,左右对比最大值在左边还是右边,再把最大值放到新数组的最后面

总结:做这个题相当又巩固了一遍昨天的知识,已经开始熟练亿点点啦~~

代码:①暴力解法

def sortedSquares(self, nums):
    for i in range(len(nums)):
        nums[i] *= nums[i]
    nums.sort()
    return nums

②双指针

def sortedSquares(self, nums):
    l, r, i = 0, len(nums) - 1, len(nums) - 1
    res = [float('inf')] * len(nums)  # 初始化,存放结果
    while l <= r:
        if nums[l] ** 2 < nums[r] ** 2:  # 有序递增数组,平方后不是左边最大就是右边最大
            res[i] = nums[r] ** 2
            r -= 1
        else:
            res[i] = nums[l] ** 2
            l += 1
        i -= 1
    return res

二、209.长度最小的子数组

思路:通过滑动j终止位置来累加元素是否>=target,目标成立计算当前连续数组的长度,起始位置则左移,缩小范围看目标是否成立,不成立终止位置再左移

总结:看着简单,认真敲起来密思极恐,细节处理一塌糊途,特别是最后的返回值,居然返回成累加数(扶额苦笑.jpg),跑死对不上号,差点怀疑人生,不过还是让我学到了新知识,想不到吧~

代码:①滑动窗口

def minSubArrayLen(self, target, nums):
    # 长度最小的子数组-滑动窗口
    i, j = 0, 0  # i起始位置,j终止位置
    min_len = float('inf')
    res = 0  # 累加数
    while j < len(nums):
        res += nums[j]
        while res >= target:
            min_len = min(min_len, j - i + 1)  # 计算子数组长度
            res -= nums[i]
            i += 1  # 起始位置右移
        j += 1
    min_len = 0 if min_len == float('inf') else min_len
    return min_len

三、59.螺旋矩阵

思路:边界太多,看到头点点大,左右、上下、右左、下上依次循环

总结:看到题目的时候,emo了下,觉得自己还是太菜了。。此代码解法太妙,只敢在心里直呼牛哇。脑子是个好东西,可惜不是人人都有,我就只有一星半点,还得再练练,再会。。

代码:

def generateMatrix(self, n):
    # 螺旋矩阵 II
    mat = [[0] * n for _ in range(n)]
    l, r, t, b = 0, n - 1, 0, n - 1
    num, tar = 1, n * n
    while num <= tar:
        for i in range(l, r + 1):  # 左向右
            mat[t][i] = num
            num += 1
        t += 1
        for i in range(t, b + 1):  # 上向下
            mat[i][r] = num
            num += 1
        r -= 1
        for i in range(r, l - 1, -1):  # 右向左
            mat[b][i] = num
            num += 1
        b -= 1
        for i in range(b, t - 1, -1):  # 下向上
            mat[i][l] = num
            num += 1
        l += 1  # 最后这个会把中心填上
    return mat

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值