刷题day(2)|代码随想录

99 阅读2分钟

本系列文章是我刷代码随想录过程中的笔记。代码地址:leetcode

今天是我刷“代码随想录”的第二天

今日内容

  1. 有序数组的平方
  2. 长度最小的子数组
  3. 螺旋矩阵

leetcode 977.有序数组的平方

这道题是一个双指针的题目。注意到负数的平方为正数,那么,我们可以从数组的两端设定两个指针,分别定义为lr, 同时设定一个指针p指向结果数组的末尾。设定循环结束条件为头指针大于尾指针

如果nums[l] * nums[l] > nums[r] * nums[r]的时候,我们将头指针的平方赋给p,同时l++,p--;其他情况下将尾指针的平方赋给p,同时r--,p--。 如动图所示。

下面是求解代码

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        result = [0 for _ in nums]
        l, r = 0,len(nums) - 1
        p = len(nums) - 1
        while l <= r:
            if (nums[l] * nums[l]) < (nums[r] * nums[r] ):
                result[p] = nums[r] ** 2
                r -= 1
            else:
                result[p] = nums[l] ** 2
                l += 1
            p -= 1
        return result

leetcode 209. 长度最小的子数组

这道题主要用了滑动窗口的思想。难点在于如何控制窗口的大小以及什么时候改变。对于这道题而言,当连续子数组的和小于目标值的时候,改变右端,即往子数组中追加元素;当和大于等于目标值的时候,比较子数组的长度与已知子数组的长度的大小并记录较小的那个,移动左端。最后返回长度。 下面是求解代码

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        res = float("inf")   # 定义一个无限大的数
        Sum = 0     # 滑动窗口数值之和
        i = 0      # 滑动窗口起始位置
        for j in range(len(nums)):
            Sum += nums[j]
            while Sum >= s:
                res = min(res, j-i+1)
                Sum -= nums[i]
                i += 1
        return 0 if res == float("inf") else res

leetcode 59. 螺旋矩阵 II

这道题是一道模拟题,按照题目描述的说明走完全程即可。难点在于要注意边界值。尤其是最后一次从右往左的值很容易被忽略。

下面是求解代码。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0 for _ in range(n)] for _ in range(n)]
        t, b, l, r = 0, n - 1, 0, n - 1
        s = 1
        while r - l >= 1 and b - t >= 1:
            # 上
            for i in range(l, r + 1):
                res[t][i] = s
                s += 1
            t += 1
            # print(res)
            # 右
            for i in range(t, b + 1):
                res[i][r] = s
                s += 1
            r -= 1
            # print(res)
            # 下
            for i in range(r, l, -1):
                res[b][i] = s
                s += 1
            b -= 1
            # 左
            for i in range(b + 1, t - 1, -1):
                res[i][l] = s
                s += 1
            l += 1
        if n % 2:
            mid = n // 2
            res[mid][mid] = n * n
        return res

总结

数组部分到今天就结束了。目前来说都是一些经典的简单题。难点在于如何处理边界条件,能不能想出求解的思路和过程。还有就是边界值的处理,像昨天的二分法,今天的模拟法,都是涉及到边界值的处理问题。这些题目值得刻在DNA里。