【代码随想录算法训练营第二天 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵】

977.有序数组的平方

双指针法

原数组是一个可能有负数的非递减顺序数组,因此对其平方后最大值应当是两边往中间出现。使用双指针分别指向原数组两端,比较绝对值大小后,选取绝对值大的将其平方对输出数组从尾部开始递减放入。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left = 0
        right = len(nums) - 1
        new_nums = [0] * len(nums)
        for i in range(len(nums)-1,-1,-1):
            if abs(nums[left])>abs(nums[right]):
                new_nums[i] = nums[left] ** 2
                left += 1
            else:
                new_nums[i] = nums[right] ** 2
                right -= 1
        return new_nums

209.长度最小的子数组

双指针法/滑动窗口

我还是觉得叫双指针法理解起来方便一点(统一一下方法,方便理解)
一个指针负责遍历整个数组,并对其进行累加,当累加值大于目标值之后,开始滑动左边的指针,一个个减去左边的值,当两个指针内的元素总和又小于目标值之后,继续开始右指针的遍历。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        min_l = len(nums)+1
        start = 0
        win_sum = 0
        for i in range(len(nums)):
            win_sum += nums[i]
            while(win_sum>=target):
                min_l = min(min_l, i - start + 1)
                win_sum -= nums[start]
                start += 1

        return min_l if min_l != len(nums)+1 else 0

59.螺旋矩阵

纯模拟的题目,主要是要找到规律
在这题中,需要遵循先左到右,再上到下,再右到左,再下到上的画图循环。
需要注意的是每次循环结束后,起始点x+=1,y+=1,并且当n为奇数的时候,中间值不在循环逻辑中,需要单独赋值。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        num = 0
        x = 0
        y = 0
        out = [[0]*n for _ in range(n)]
        max = n**2
        while (num<max):
            if n == 1:
                print(n,num,x,y)
                num += 1
                out[x][y] = num
                break
            else:
                for i in range(n-1):
                    num += 1
                    out[x][y+i] = num
                for j in range(n-1):
                    num += 1
                    out[x+j][y+n-1] = num
                for i in range(n-1):
                    num += 1
                    out[x+n-1][y+n-1-i] = num
                for j in range(n-1):
                    num += 1
                    out[x+n-1-j][y] = num
            n -= 2
            x += 1
            y += 1
        return out

总结

数组比较重要的感觉就算双指针法,别的都可以看作是双指针法的衍生。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stark的小笨手2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值