cpp
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> result(n);
int k = nums.size()-1;
int left = 0;
int right = nums.size() - 1;
while ( left <= right ) {
if ( nums[left]*nums[left] >= nums[right]*nums[right] ) {
result[k--] = nums[left]*nums[left];
left++;
} else {
result[k--] = nums[right]*nums[right];
right--;
}
}
return result;
}
};
思路类似于归并排序,我们需要首先注意到,距离零更远的数字,是平方更大的数字,换句话说,就是绝对值更大的数字,是平方更大的数字。我们这样做是一个线性的做法,如果我们按照绝对值排序,只要是基于比较的排序算法,时间复杂度的下界就是 O(nlogn)O(nlogn)O(nlogn) ,所以的话,我们需要更小的时间复杂度需要考虑不进行排序,考虑用双指针实现我们的需求。
左边的指针 left 从左边往右边扫描,右边的指针 right 从右边往左边扫描。计算对应的元素的平方,取较大者存入我们的结果向量 result ,然后我们是找到的最大的平方,所以的话,我们选择从最大的下标 nums.size()−1nums.size()-1nums.size()−1 开始减小,自减即可。扫描结束,我们的单调非降的向量 result 就完成了。
通过上面的步骤,可以在线性的时间内,把一个有序的数组,平方之后,仍然是有序的数组。双指针的优势非常明显。