刷题 Day1

41 阅读1分钟

逐渐开始补上之前没刷的题目吧....

数组

977. 有序数组平方 🔗

初看觉得挺简单的,就是平方一下然后sort就可以了。但是后面看到有双指针的做法,觉得挺奇妙的,因为原先数组是排序的,但是因为平方后大小不一定按照原先排序(有负数),所以在使用双指针处理的时候需要注意。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l, r, i = 0, len(nums) - 1, len(nums) - 1
        res = [0] * 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.长度最小的子数组 🔗

暴力解法两个 for loop 很简单,但是超时间限制了。可以使用双指针/滑动窗口的思路来写。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l, r = 0, 0
        cur = 0
        min_len = float('inf')   # 需要定义一个最大的值,方便后续比较

        while r < len(nums):
            cur += nums[r]

            while cur >= target:
                min_len = min(min_len, r - l + 1)   # 更新 min length 长度
                cur -= nums[l]
                l += 1

            r += 1

        if min_len == float('inf'):
            return 0
        else:
            return min_len