python算法 day2 (977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II)

题目链接:

977. 有序数组的平方 - 力扣(LeetCode)

209. 长度最小的子数组 - 力扣(LeetCode)

59. 螺旋矩阵 II - 力扣(LeetCode)

977- 有序数组的平方 

1 暴力

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

2 暴力-简洁版

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        return sorted(num * num for num in nums)

3 双指针

from typing import List

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l = 0              # Left pointer
        r = len(nums) - 1  # Right pointer
        i = len(nums) - 1
        lst = [0] * len(nums)
        while l <= r:
            if nums[l] ** 2 >= nums[r] ** 2:
                lst[i] = nums[l] ** 2
                l += 1
            else:
                lst[i] = nums[r] ** 2
                r -= 1
            i -= 1
        return lst

注意 

双指针要从右边(大的平方数)开始

209- 长度最小的子数组

1 暴力(会超时)

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        min_length = len(nums) + 1
        for length in range(len(nums),0,-1):
            for start in range(0,len(nums)-length+1):
                sub_array = nums[start:start+length]
                if sum(sub_array) >= target:
                    min_length = length
        return min_length if min_length != len(nums) + 1 else 0

2 滑动窗口

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = 0
        right = 0
        nums_length = len(nums)
        sum_subarray = 0
        min_length = float("inf")

        while right <= nums_length - 1:
            sum_subarray += nums[right]

            while sum_subarray >= target:
                min_length = min(min_length, right-left+1)
                sum_subarray -= nums[left]
                left += 1

            right += 1
        return min_length if min_length != float("inf") else 0
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

注意

窗口的起始位置如何移动 

 

 59- 螺旋矩阵Ⅱ

1 简洁版

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

注意

保证循环规则一致

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫金港野生咩咩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值