有序数组的平方(leetcode977)
最简单方法,先对数组内部元素平方,再通过sorted函数进行排序
class Solution:
def SortedSquares(self, nums: List[int]) -> List[int]:
return sorted(num ** 2 for num in nums)
时间复杂度
O(n + nlogn)
双指针法
思路
![](https://img-blog.csdnimg.cn/img_convert/7fe4ea7097e0a8ce06c9cc56aedf394a.png)
定义一个新的空数组,长度与原数组相等。result = [];
考虑到原数组存在负数,可能负数平方后反而成为数组中最大值,且这个最大值不是在数组的最左闭,就是最右边;
新的数组由大到小更新,所以下标也应该由大到小更新,索引下标 k = len(nums) - 1;
定义两个下标 i = 0, j = len(nums) - 1 , 当 i <= j 时,循环终止,注意: 如果仅判断 i < j, 就结束循环,会导致中间数据还没取到就返回数据;
判断 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],与大于结果相同;
判断,小于情况, 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)
思路
![](https://img-blog.csdnimg.cn/img_convert/d3b4569a21574bc19d39c4017835483e.png)
滑动窗口
就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
在本题中实现滑动窗口,主要确定如下三点:
窗口内是什么?
如何移动窗口的起始位置?
如何移动窗口的结束位置?
窗口就是 满足其和 ≥ 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