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

109 阅读2分钟

Leetcode 977 Squares of a Sorted Array

1. 第一想法

没想到怎么用双指针,于是都平方了然后排序

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        res = []
        for i in nums:
            a = i*i
            res.append(a)
        res.sort()
        return res

2. 看完后想法

因为原数组是排过序的,平方后不是左边最大就是右边最大,所以考虑双指针。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        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

3. 总结

暴解是比较容易想到的,以后要注意原数组是否排序过。

Leetcode 209 Minimum Size Subarray Sum

1. 第一想法

我知道要用 sliding window,我知道我做过看过讲解,印象里是不是要用 hash 什么的,但是再一次面对还是不会。

2. 看完后想法

知道要用 sliding window 反而有点缺乏想象力了,暴解本应是可以想到的。开始需要思考循环的变量是起始还是终止位置。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l = len(nums)
        left = 0
        right = 0
        min_len = float('inf')
        cur_sum = 0
        
        while right < l:
            cur_sum += nums[right]
            
            while cur_sum >= target:
                min_len = min(min_len, right - left + 1)
                cur_sum -= nums[left]
                left += 1
            
            right += 1
            
        return min_len if min_len != float('inf') else 0

3. 总结

感觉还是有些难的,不确定自己之后做能不能做出来。

Leetcode 59 Spiral Matrix II

1. 第一想法

没有想法。

2. 看完后想法

也不是没想过要左开右闭,但是觉得代码实现会很麻烦。

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

3. 总结

确实感觉比较麻烦。