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

文章探讨了如何使用双指针解决数组排序问题,以及应用滑动窗口找到最小子数组长度。在977题中,通过双指针优化暴力排序;209题利用滑动窗口找寻满足条件的最小子数组;59题则涉及矩阵生成的边界条件处理。
摘要由CSDN通过智能技术生成
  • 今日学习的文章链接,或者视频链接

第一章 数组part02 第一章 数组part02

  • 自己看到题目的第一想法

977:

1.暴力解法:先平方,再排序,光排序就O(nlogn),肯定超时

2.联想到插入排序,先平方,再插入到数列中,O(n^2)

3.知道要用双指针,但不知道应该怎么用

209:

暴力解法:找出所有满足条件的子数组,返回长度最小的子数组的长度

59:

没思路

  • 看完代码随想录之后的想法

977:

数组其实是有序的, 只不过负数平方之后可能成为最大数了。

那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。

联想到quick sort的partition,O(n)

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        start = 0
        end = len(nums) - 1
        result = [0] * len(nums)
        k = len(nums) - 1
        while start <= end and k>=0:
            if nums[start]**2 < nums[end]**2:
                result[k] = nums[end]**2
                k -= 1
                end -= 1
            elif nums[start]**2 > nums[end]**2:
                result[k] = nums[start]**2
                k -= 1
                start += 1
            else:
                result[k] = nums[start]**2
                k -= 1
                start += 1
        return result

209:

滑动窗口,关键是起始位置的移动

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        result = float('inf')
        sum = 0
        i = 0
        subLength = 0
        for j in range(len(nums)):
            sum +=nums[j]
            while sum >= target:
                subLength = j - i + 1
                result = min(result, subLength)
                sum -= nums[i]
                i += 1
        return 0 if result == float('inf') else result

59:

循环不变量

左闭右开

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0] * n for _ in range(n)]
        startx, starty = 0, 0
        loop = n // 2
        mid = n // 2
        count = 1
        offset = 1
        i, j = 0, 0
        
        while loop:
            i, j = startx, starty
            for j in range(starty, n - offset):
                res[startx][j] = count
                count += 1
            j += 1
            for i in range(startx , n - offset):
                res[i][j] = count
                count += 1
            i += 1
            while j > starty:
                res[i][j] = count
                count += 1
                j -= 1
            while i > startx:
                res[i][j] = count
                count += 1
                i -= 1
            
            startx += 1
            starty += 1
            offset += 1
            loop -= 1

        if n % 2:
            res[mid][mid] = count

        return res
  • 自己实现过程中遇到哪些困难

977:

if elif与if if的区别没有深刻理解,导致程序出错

209:

滑动窗口第一次写还不熟练

59:

边界条件的处理

  • 今日收获,记录一下自己的学习时长

双指针

滑动窗口

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值