代码随想录算法训练营第二天| 977. 有序数组的平方、209. 长度最小的数组

发布时间 2023-08-08 21:05:05作者: 小张爱Study

# 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]

第一眼感受:

直观想到的是,先平方,再用排序,但这样的话时间复杂度至少是O(n log n)。

正确思路

双指针法:
可以观察到,整个数组的最大值要么在最左侧要么在最右侧,整个数组呈从大到小再到大的规律,我们可以用两个指针,一个在最左端,一个在最右端,若一侧的值最大,则那侧的值读入到新开的数组的最后一位。

点击查看代码
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left = 0
        right = 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[right] * nums[right]
                right -= 1
            else:
                res[i] = nums[left] * nums[left]
                left += 1
            i -= 1
        return res

这时的时间复杂度为O(n)
相关的题目(左右指针)
来自录友轰车车的博客

  1. 二分查找类:704 二分搜索
  2. 合并有序数组类:977 有序数组的平方
  3. nSum类:167 二数之和II
  4. 反转类:344 反转字符串
  5. 回文类: 5 最长回文字符串

# 209.长度最小的子数组

题目链接:
长度最小的子数组
题目:
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

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

1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5

暴力解法(双循环)
思路:建立两个循环,i遍历从每一个位置的i开始,j遍历从i开始多少位能,以此来记录累计只和。

点击查看代码
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        N_nums = len(nums)
        min_len = float('inf')

        for i in range(N_nums):
            cur_sum = 0
            for j in range(i,N_nums):
                cur_sum += nums[j]
                if cur_sum >= target:
                    min_len = min(min_len,j-i+1)
                    break
        return min_len if min_len!= float("inf") else 0
滑动窗口法: 待补充