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

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

一、977.有序数组的平方

文档链接:代码随想录

题目链接: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 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n) 的算法解决本问题

代码:

  • 双指针法

思路:数组的值按照升序排列,存在负数,平方后两边的值最大,依次判断平方后两边的值哪个大,大的值依次放在新数组的最右边(新数据也是按照升序排列)

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left,right,k = 0,len(nums)-1,len(nums)-1
        result = [float('inf')] * len(nums) #具有相同长度并初始化为正无穷大的列表
        while left<=right:
            if nums[left]**2>nums[right]**2:
                result[k]=nums[left]**2
                left+=1
            elif nums[left]**2<=nums[right]**2:
                result[k]=nums[right]**2
                right-=1
            k-=1
        return result

二、209.长度最小的子数组

文档链接:代码随想录

题目链接: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 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

进阶:

  • 如果你已经实现O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

代码:

  • 滑动窗口

思路:通过窗口的左右边界解决问题

  1. 初始化left和right为0,sum为0,minlen为正无穷大。
  2. 当right小于数组长度时,执行以下步骤:
    • 将nums[right]加到sum中。
    • 当sum大于等于target时,更新min_len为min(min_len, right - left + 1)。
    • 当sum大于等于target时,将nums[left]从sum中减去,并将left右移一位。
    • 将right右移一位。
  3. 返回minlen,如果minlen仍然为正无穷大,则返回0。
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left, right, sum = 0, 0, 0
        minlen = float("inf")  # 正无穷大
        for right in range(len(nums)):
            sum += nums[right]
            while sum >= target:  # 子数组之和大于目标值
                minlen = min(minlen, right - left + 1)
                sum -= nums[left]
                left += 1

            right -= 1
        return minlen if minlen != float("inf") else 0

三、59.螺旋矩阵II

文档链接:代码随想录

题目链接:59.螺旋矩阵II

视频讲解:视频讲解

题目描述:

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

代码:

思路:要生成一个按顺时针螺旋顺序排列的 n×n 矩阵,我们可以使用四个指针来跟踪当前要填充的位置。初始时,这四个指针分别指向矩阵的左上角、右下角、左下角和右上角。然后,我们按照以下步骤进行填充:

  1. 从左到右填充上边界的行:
  • 初始化一个循环,从 left 到 right,步长为 1。
  • 在每次循环中,将当前数字 num 填充到 matrix[top][i] 中,并将 num 自增。
  • 更新 top 指针,使其下移一行。
  1. 从上到下填充右边界的列:

    • 初始化一个循环,从 top 到 bottom,步长为 1。
    • 在每次循环中,将当前数字 num 填充到 matrix[i][right] 中,并将 num 自增。
    • 更新 right 指针,使其左移一列。
  2. 从右到左填充下边界的行:

    • 初始化一个循环,从 right 到 left,步长为 -1。
    • 在每次循环中,将当前数字 num 填充到 matrix[bottom][i] 中,并将 num 自增。
    • 更新 bottom 指针,使其上移一行。
  3. 从下到上填充左边界的列:

    • 初始化一个循环,从 bottom 到 top,步长为 -1。
    • 在每次循环中,将当前数字 num 填充到 matrix[i][left] 中,并将 num 自增。
    • 更新 left 指针,使其右移一列。
  4. 重复步骤 1-4,直到所有数字都被填充到矩阵中。

  5. 返回生成的矩阵。

通过这种方式,我们可以按照顺时针螺旋顺序生成一个 n×n 的矩阵。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        # 初始化一个 n*n 的矩阵,所有元素为 0
        matrix = [[0] * n for _ in range(n)]

        # 当前要填充的数字
        num = 1

        # 定义矩阵的边界,初始时左、右、上、下分别为 0 到 n-1
        left, right, top, bottom = 0, n - 1, 0, n - 1

        # 当还有数字需要填充时,继续循环
        while num <= n * n:
            # 从左到右填充上边界的行
            for i in range(left, right + 1):
                matrix[top][i] = num
                num += 1
            top += 1  # 上边界下移

            # 从上到下填充右边界的列
            for i in range(top, bottom + 1):
                matrix[i][right] = num
                num += 1
            right -= 1  # 右边界左移

            # 从右到左填充下边界的行
            for i in range(right, left - 1, -1):
                matrix[bottom][i] = num
                num += 1
            bottom -= 1  # 下边界上移

            # 从下到上填充左边界的列
            for i in range(bottom, top - 1, -1):
                matrix[i][left] = num
                num += 1
            left += 1  # 左边界右移

        return matrix  # 返回生成的矩阵

你可能感兴趣的:(算法,算法,数据结构)