Leetcode DAY2:有序数组的平方 长度最小的子数组 螺旋矩阵

977.有序数组的平方

(1)暴力

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

上来直接 平方之后 排序 一分钟搞定

(2)双指针

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left = 0
        right = len(nums) - 1
        n = len(nums)
        res = [0] * n
        while left <= right:
            if nums[left] * nums[left] <= nums[right] * nums[right]:
                res[n - 1] =  nums[right] * nums[right]
                right -= 1
            elif nums[left] * nums[left] > nums[right] * nums[right]:
                res[n - 1] = nums[left] * nums[left]
                left += 1
            n -= 1
        return res

逻辑也很清晰 5分钟搞定  由于数组是有序的 所以 平方项的最大的再两端 最小的在中间 所以通过比较两端平方大小 加入数组 然后移动指针 

209.长度最小的子数组

(1)滑动窗口

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        minlen = len(nums) + 1
        left = 0
        sum = 0 
        for right in range(len(nums)):
            sum += nums[right]
            while sum >= target:
                length = right - left + 1
                minlen = min(length,minlen) 
                sum -= nums[left]
                left += 1
        
        if minlen == len(nums) + 1:
            return 0
        else:
            return minlen

写前大概看了下滑动窗口的文字思路 差不多理解了

相当于控制left right两个指针 计算这两个指针之内的数的和

如果大于等于目标的话 就记录下这个 长度 然后left指针向后移 (要在sum中减掉当前nums[left])还需要对最小长度进行更新

如果小于目标的话 就把right指针向后移

59.螺旋矩阵II

Leetcode DAY2:有序数组的平方 长度最小的子数组 螺旋矩阵_第1张图片

 

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0] * n for _ in range(n)]
        startx = 0
        starty = 0
        border = 1
        count = 1

        for i in range(n//2):
            for j in range(starty, n - border):
                nums[startx][j] = count
                count += 1
            for i in range(startx, n - border):
                nums[i][n - border] = count
                count += 1
            for j in range(n - border, starty, -1):
                nums[n - border][j] = count
                count += 1
            for i in range(n - border, startx, -1):
                nums[i][starty] = count
                count += 1
            startx += 1
            starty += 1
            border += 1
        if n % 2 == 1:
            nums[n//2][n//2] = count
        
        return nums

自己完全没思路 看别人的思路了解了 自己再手写了一遍 在敲了一遍

主要就是边界处理地一个过程 设置 startx,starty,以及边界厚度border 一层一层进行处理

每次处理start开始到倒数第二个 用count给nums进行赋值 每次++一次

你可能感兴趣的:(leetcode,矩阵,算法)