由题目得知数组为非递减顺序,由此可以判断平方后的数较大的数值会位于数组的两端逐渐向中聚拢的情况
做题时的解题思路:
利用双指针left,right分别指向数组首部与数组尾部,创建一个新的数组ans,将两个指针所指向的位置的元素进行比较,将较大的元素依次从尾部向首部填充。
if nums[left]**2 > nums[right]**2:
ans[n - 1] = nums[left]**2
left += 1
else:
ans[n - 1] = nums[right]**2
right -= 1
left right
-3 | -1 | 0 | 2 | 3 | 5 |
因为right^2 > left^2,所以将25填入数组尾部,将n(新数组尾部指针)向前移动一位
n -= 1
ans[n - 1] = nums[right]**2
0 | 0 | 0 | 0 | 0 | 25 |
n <- n
填完之后将 right 指针向前移一位,所指向的元素的平方继续与left指针所指向元素的平方比较。如果大于则填入,否则left填入
left right
-3 | -1 | 0 | 2 | 3 | 5 |
left right
-3 | -1 | 0 | 2 | 3 | 5 |
0 | 0 | 0 | 0 | 9 | 25 |
n <- n
比较直到left <= right(左右指针相遇)为止。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums) - 1
n = len(nums)
ans = [0] * n
while left <= right:
if nums[left]**2 > nums[right]**2:
ans[n - 1] = nums[left]**2
left += 1
else:
ans[n - 1] = nums[right]**2
right -= 1
n -= 1
return ans