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

 977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

力扣题目链接

思路:

1.数据结构:数组 / 列表

2.算法:双指针(left, right)

3.步骤:

由于所给数组是包含负数的升序排列的数组,故各元素平方后的最大值一直都在数组的左右两边,故双指针要从数组左右两端向中间遍历

a.比较数组两端元素平方值,左边大则 res.append(nums[left]**2) ,left += 1, 右边大则res.append(nums[right]**2) , right += 1

b.由于返回的列表要求升序排列,而此时的res是降序排列,故需res.reverse()

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

209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:

输入:target = 4, nums = [1,4,4]
输出:1
示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

力扣题目链接

思路:

1.数据结构:数组 / 列表

2.算法:滑动窗口(l, r)

3.步骤:

本题核心是判断窗口内的sum >= target 与否,所以要时刻保证sum是窗口内的值之和。

a.将l 和 r 初始值设为0

b.sum从nums第一个元素开始加起,加一次判断一次

c.若sum < target, r 右移一位,窗口向右扩展

d.若sum >= target, 则进入while 循环 一直缩减左边窗口

e.知道右窗边界抵达原数组长度时循环结束

f.以三元运算符返回结果

class Solution(object):
    def minSubArrayLen(self, target, nums):
        l, r = 0, 0
        sum = 0
        res = 1000000

        while r < len(nums):
            sum += nums[r]

            while sum >= target:
                res = min(r-l+1, res)
                sum -= nums[l]
                l += 1
            
            r += 1
        
        return 0 if res == 1000000 else res

59.螺旋矩阵

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

 示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

思路:

1.先根据n来创建二维列表,二维列表的表达式为mat = [[0 for _ in range(n)] for _ in range(n)]

2.定义四个参数, l, r, t, b,分别代表正方形的四个边界

3.设num初值为1,将num++依次放进

tips:range(i, j) 包含i不包含j, range(b, t-1, -1)是从b开始到t-1,不包含t-1,只到t(相当于数轴上从右往左数,左为开区间)

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        l ,r, t, b = 0, n-1, 0, n-1
        mat = [[0 for _ in range(n)] for _ in range(n)]
        num, tar = 1, n * n

        while num <= tar:
            for i in range(l, r+1):
                mat[t][i] = num
                num += 1
            t += 1
            for i in range(t, b + 1):
                mat[i][r] = num
                num += 1
            r -= 1
            for i in range(r, l-1, -1):
                mat[b][i] = num
                num += 1
            b -= 1
            for i in range(b, t-1, -1):
                mat[i][l] = num
                num += 1
            l += 1

        return mat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值