左右指针
相关典型题目:
- 二分查找类:LC704 二分搜索
- 合并有序数组类:LC977 有序数组的平方
- nSum类:LC167 两数之和II
- 反转类:LC344 反转字符串
- 回文类(相背而行):LC5 最长回文字符串
LC977 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 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]
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
# 初始化左右指针,一头一尾
i, j = 0, n - 1
# 结果数组的写入位置的指针,逆序写入
p = n - 1
res = [0] * n
# 执行双指针合并有序数组的逻辑
# 由于逆序写入,绝对值大的先写入,并且指针移动
while i <= j:
if abs(nums[i]) > abs(nums[j]):
res[p] = nums[i] * nums[i]
i += 1
else:
res[p] = nums[j] * nums[j]
j -= 1
p -= 1
return res
复杂度分析:由于本题仅使用一个单层while循环对数组进行遍历,时间复杂度为