题目描述:
给你一个按 非递减顺序 排序的整数数组 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]
思路:
数组 nums 是非递减排序的数组,那就相当于是个递增的数组,且每个元素值有正有负。
通过这两个条件其实我们可以得出,平方以后的最大值肯定出现在两侧,不是左边就是右边(负数的平方为正数)。
碰到这种情况,我们一般祭出双指针法来解决,left 指向下标 0,right 指向下标 n - 1:
新建一个结果数组 res 存储最后的结果,site 指向数组末尾,数组从后向前存储。
若 nums[left] * nums[left] < nums[right] * nums[right],res[site] = nums[right] * nums[right]。
若 nums[left] * nums[left] >= nums[right] * nums[right],res[site] = nums[left] * nums[left]。
代码:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
# 初始化双指针
left = 0
right = len(nums) - 1
# 存储结果数组,从数组末尾开始存储
res = [-1] * len(nums)
site = len(nums) - 1
# 注意这里是 <=
while left <= right:
# 从两端遍历,将平方数组大得存储在 res 数组中
if nums[left] * nums[left] < nums[right] * nums[right]:
res[site] = nums[right] * nums[right]
right -= 1
else:
res[site] = nums[left] * nums[left]
left += 1
site -= 1
return res