代码随想录训练营第二天

有序数组的平方(leetcode977)

  1. 最简单方法,先对数组内部元素平方,再通过sorted函数进行排序

class Solution:
    def SortedSquares(self, nums: List[int]) -> List[int]:
        return sorted(num ** 2 for num in nums)

时间复杂度

O(n + nlogn)

双指针法

思路

代码随想录训练营第二天_第1张图片
  1. 定义一个新的空数组,长度与原数组相等。result = [];

  1. 考虑到原数组存在负数,可能负数平方后反而成为数组中最大值,且这个最大值不是在数组的最左闭,就是最右边;

  1. 新的数组由大到小更新,所以下标也应该由大到小更新,索引下标 k = len(nums) - 1;

  1. 定义两个下标 i = 0, j = len(nums) - 1 , 当 i <= j 时,循环终止,注意: 如果仅判断 i < j, 就结束循环,会导致中间数据还没取到就返回数据;

  1. 判断 nums[i] * nums[i] > nums[j] * nums[j],更新result[k] = nums[i] * nums[i] , k -= 1, i += 1; 当 nums[i] * nums[i] = nums[j] * nums[j],与大于结果相同;

  1. 判断,小于情况, result[k] = nums[j] * nums[j] k -= 1, j -= 1

代码实现

class Solution:
    def SortedQuard(self, nums):
        i, j, k = 0, len(nums) - 1, len(nums) - 1
        result = []
        result = [-1] * len(nums)
        while i <= j:
            if nums[i] ** 2 > nums[j] ** 2:
                result[k] = nums[i] ** 2
                i += 1
            else:
                result[k] = nums[j] ** 2
                j -= 1
            k -= 1
        return result

时间复杂度

O(n)

长度最小的子数组(leetcode209)

思路

代码随想录训练营第二天_第2张图片

滑动窗口

就是不断的调节子序列起始位置终止位置,从而得出我们要想的结果。

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?

  • 如何移动窗口的起始位置?

  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。j 为终止位置,i = 0 为起始位置 并且 i 动态移动;

for j in range(len(nums)):

sum += nums[ j ] # 收集滑动窗口中的和

当滑动窗口内的和大于目标值时,i 向前 移动

注意:while 不能写if 否则,代码会一直判断,直至得到sum < tarket 时,滑动窗口的区域,而不是最小区域。

while sum >= tarket:

滑动窗口的长度:subl = j - i + 1

result = float("inf") # 初始定义无限大

滑动窗口长度:定义的最大值与当前获取到的subl间最小值

result = min(result, subl)

当i向后移动以为,sum的值应该-nums [i], i += 1

代码实现

class Solution:
    def minSubArrayLen(self, tarket: int, nums: List[int]) -> int:
        i = 0  # 初始位置 0 
        _sum = 0  # 滑动窗口内的值
        res = float("inf")  # 定义最大值
        for j in range(len(nums)):
            _sum += nums[j]
            while _sum >= tarket:
                subl = j - i + 1 # 滑动窗口长度
                res = min(res, subl) # 在最大长度与滑动窗口的长度的最小值
                _sum -= nums[i]
                i += 1    # 满足条件,初始位置向前移动1
           return res if res != float("inf") else 0 

你可能感兴趣的:(python,算法)