(一)问题描述
LeetCode题目链接https://leetcode.cn/problems/squares-of-a-sorted-array/description/给你一个按 非递减顺序 排序的整数数组 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]
提示:
- 1<=nums.length<= 10^4
- -10^4<=nums[i]<=10^4
- nums已按非递减顺序排序
进阶:
请你设计时间复杂度为O(n)的算法解决本问题。
(二)关键词提取
- 非递减顺序排序
- 每个数字的平方
负数的数值越小,绝对值越大。平方后数字的大小取决于平方前数字的绝对值。原始数组的绝对值两侧大中间小。所以应该从两边向中间查找最大值。
(三)解题思路
相向双指针法
没办法原地排序,那就要再定义一个新数组用来存储结果。左指针和右指针所指向的元素进行比较,取平方更大的放进新数组。
伪代码:
sortedSquares(int[] nums)
//相向双指针法实现有序数组的平方
//输入:非降序整数数组nums
//输出:非降序的平方后数组result
left←0, right←nums.length-1, k←0
while left<=right
if nums[right]*nums[right]>nums[left]*nums[left]
result[k]←nums[right]*nums[right]
right←right-1
else
result[k]←nums[left]*nums[left]
left←left-1
k←k-1
(四)易错点
k(即新数组下标)的定义要在while循环之外。这和变量的作用域有关。如果定义在while循环内,相当于k每次循环都要“刷新”。