【leetcode-python】977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵。

977.有序数组的平方

题目链接:977.有序数组的平方
文档讲解:977.有序数组的平方-文档讲解
视频讲解:977.有序数组的平方-视频讲解
思路:利用双指针,两个指针分别控制区间的左右元素。

有序数组可能有三种情况:全部大于等于0;全部小于等于0;一部分大于0一部分小于0。

  • 构建一个新的数组res = [float('inf')] * len(nums),用于存放整理好的数组,新创建的数组从后往前遍历
  • 左右指针指向原数组的左右边界元素,不断相比较左右指针指向的元素,将更大的值赋值给新数组
  • 边界条件处:left <= right,这里需要相等,此时两个指针指向的元素也要取平方项赋值给新数组
class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        # 11234
        left, right = 0, len(nums) - 1
        i = len(nums) - 1
        res = [float('inf')] * len(nums)
        while left <= right: # 为什么要等于?
            if nums[left] * nums[left] > nums[right] * nums[right]:
                res[i] = nums[left] * nums[left]
                left += 1
            elif nums[left] * nums[left] <= nums[right] * nums[right]:
                res[i] = nums[right] * nums[right]
                right -= 1

            i -= 1
        return res

209.长度最小的子数组

题目链接:209.长度最小的子数组
文档讲解:209.长度最小的子数组-文档讲解
视频讲解:209.长度最小的子数组-视频讲解
思路:利用双指针、滑动窗口思想

  • 将左右指针划定的区域作为窗口,不断遍历移动右指针,将右指针元素添加进窗口和sum中;
  • 当窗口内元素和大于等于target的时候,将当前窗口长度与已记录的窗口长度length作比较,取最小值,移动左指针,缩小窗口;
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        # 从一个数组中,找出子数组,是连续的
        left, right = 0,0
        sum = 0
        length = float('inf')
        while right < len(nums):
            sum += nums[right]
            while sum >= target:
                length = min(length, right - left + 1) 
                sum -= nums[left]
                left += 1    
            right += 1
        return  length if length != float('inf') else 0

59.螺旋矩阵

题目链接:59.螺旋矩阵
文档讲解:59.螺旋矩阵-文档讲解
视频讲解:59.螺旋矩阵-视频讲解
思路:利用双指针、固定区间不变量,比如[left, right)

  • 创建二维数组nums = [[0] * n for _ in range(n)]
  • 模拟顺时针画矩阵的过程:
    • 填充上行从左到右
    • 填充右列从上到下
    • 填充下行从右到左
    • 填充左列从下到上
  • 注意python语言的遍历:for offset in range(1, loop + 1) :
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          # 迭代次数、n为奇数时,矩阵的中心点
        count = 1                           # 计数

        for offset in range(1, loop + 1) :      # 每循环一层偏移量加1,偏移量从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 :			# n为奇数时,填充中心点
            nums[mid][mid] = count 
        return nums
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Miss.wei

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

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

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

打赏作者

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

抵扣说明:

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

余额充值