给你一个按 非递减顺序 排序的整数数组 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]
思路
暴力破解法:最直观的解法,每个数平方之后排个序,时间复杂度:O(n + nlogn),可以说是O(nlogn)的时间复杂度,代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for (int i = 0; i < A.size(); i++) {
A[i] *= A[i];
}
sort(A.begin(), A.end());
return A;
}
};
双指针解法:数组是有序的, 但是负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法了,i指向起始位置,j指向终止位置。定义一个新数组vec,和A数组一样的大小,让k指向result数组终止位置。
代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> vec(n);
for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {//双指针两头遍历, 注意这里要i <= j,因为最后要处理两个元素
if (nums[i] * nums[i] > nums[j] * nums[j]) {//前面的平方大就往后放,i+1
vec[pos] = nums[i] * nums[i];
++i;
}
else {//后面大,往后放入j+1
vec[pos] = nums[j] * nums[j];
--j;
}
--pos;
}
return vec;
}
};
时间复杂度:O(n)