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

目录

今日任务:

977.有序数组的平方

方法一:暴力排序法

​方法二:暴力排序法+列表推导法

方法三:双指针法

 209.长度最小的子数组

滑动窗口法: 

59.螺旋矩阵||


今日任务:

  • 977.有序数组的平方
  • 209.长度最小的子数组
  • 59.螺旋矩阵||

977.有序数组的平方

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

方法一:暴力排序法

分析:

  • 将数组中的元素先平方
  • 之后用sort()函数再进行排序

注意:

  • list.sort()直接修改原列表,sorted()不能但更有效率(在无需原列表中使用)
  • list.sort()只使用于列表,sorted()可接受任何可迭代对象 
  • 无论list.sort()还是sorted()函数,都有参数reverse,当为Flase(默认)时为升序 ,当为True时为降序
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        for i in range(len(nums)):
            val = nums[i]

            nums[i] = val**2
        
        nums.sort()
        return nums

 方法二:暴力排序法+列表推导法

分析:

  • 先使用列表推导法,将列表中的数变为平方
  • 再使用sorted()函数进行排序
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        return sorted(x*x for x in nums)

 

方法三:双指针法

分析:

  • step1:定义一个空的列表(或者是非空等长列表也可以)用两个指针i,j分别指向数组的头尾
  • step2: 

    如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。

    如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        nums1 = []
        i, j = 0, len(nums) - 1

        while i != j:
            if nums[i] ** 2 < nums[j] ** 2:
                nums1.insert(0, nums[j]**2)
                j -= 1
            else:
                nums1.insert(0, nums[i]**2)
                i += 1
        
        nums1.insert(0, nums[i]**2)
        return nums1


 209.长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

滑动窗口法: 

本题中实现滑动窗口(双指针的一种),主要确定如下三点:

  • 窗口内是什么?窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
  • 如何移动窗口的起始位置?如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
  • 如何移动窗口的结束位置?窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
class Solution:
    def minSubArrayLen(self, s: 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 >= s: # 当前累加值大于目标值
                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


59.螺旋矩阵||

 题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

 分析:

1.坚持循环不变量原则

2.模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

3.我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值