代码随想录算法训练营第二天| LeetCode977.有序数组的平方 、LeetCode209.长度最小的子数组 、LeetCode59.螺旋矩阵II

一:LeetCode977.有序数组的平方

        1:题目描述(977.有序数组的平方

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

         2:解题思路

        解法一:暴力解法:

                先遍历数组,对元素进行平方,再对数组进行排序

class Solution:
    def sortedSquares(self, nums):
        # 暴力解法:先进行平方,再进行排序
        for i in range(len(nums)):
            nums[i] = nums[i] * nums[i]
        nums.sort()
        return nums

        解法二:使用双指针

                定义两个指针,分别指向数组的一头一尾;

                定义一个新的数组,长度与原始数组保持一致,元素的初始值均置为0;

                然后对比两个指针所指向值的平方后的大小,将较大平方值,从后往前替换掉新数组的值。

        代码展示:

class Solution:
    def sortedSquares(self, nums):
        # 双指针解法
        # 定义两个指针,分别指向数组的一头一尾,在定义一个新数组,比较两个指针对应的值,将较大的值从新数组的后面往前进行替换
        n = len(nums)
        res = [0] * n
        left, right, size = 0, n-1, n-1       # size代表数组res当前指向的位置
        while left <= right:
            if nums[left]*nums[left] >= nums[right]*nums[right]:
                res[size] = nums[left]*nums[left]
                left += 1
                size -= 1
            else:
                res[size] = nums[right]*nums[right]
                right -= 1
                size -= 1
        return res

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

        1:题目描述(209.长度最小的子数组

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

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

        2:解题思路

                首先定义一个无穷大的数res_len,一个求和的变量Sum以及子数组的起始位置index;

                遍历数组,将当前遍历的值与Sum进行求和,

                判断求和后的结果是否大于等于目标值target,满足条件,获取满足条件的子数组长度,然后求res_len和满足条件的子数组的长度的最小值,找到满足条件的子数组后,我们需要将子数组起始位置的值从Sum中减去,并将子数组的起始位置index向右移动一位,进行循环判断是否满足条件,不满足条件了,继续遍历数组,直到数组遍历结束。

代码展示:

class Solution:
    def minSubArrayLen(self, target, nums):
        # 初始化满足条件的长度,初始化为最大值
        res = float("inf")
        # 初始化满足条件的元素之和,初始化为0
        Sum = 0
        # 初始化起始位置,初始化为第一个元素的下标
        index = 0
        # 遍历数组
        for i in range(len(nums)):
            # 求和,与当前遍历的值
            Sum += nums[i]
            # 判断当前元素之和,是否大于等于目标值target
            while Sum>= target:
                # 当前元素之和大于等于目标值,更新res的值,取当前res和当前遍历到的元素下标与index之间的长度中的最小值
                res = min(res, i-index+1)
                # 减去起始位置的元素
                Sum -= nums[index]
                # 向右移动起始位置
                index += 1
        return 0 if res==float("inf") else res

三、LeetCode59.螺旋矩阵II

        1:题目描述(59.螺旋矩阵II

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

        2:解题思路

        先偷个懒,明天补上。

今日总结:

首先来说第一题:977.有序数组的平方,受昨天27.移除元素的影响,一直在考虑要在同一个数组中实现,不增加额外的数组空间,导致想了半天怎么也没想通;

第二题呢:思路一下子就出来了,但是在代码实现上还是有点小问题;

第三题,完全就是没思路了,还是瞄了一眼以前写的代码,才想起来。

整体感觉就是以前写了的,也理解了的,但是自己现在再写,就是一脸懵逼,无从下手的状态,不知道是不是没理解透彻,然后自己认为自己理解透彻了。因为工作的原因,今天暂时先到这儿了,明天把该补的在补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值