1. 题目
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
2. 解题思路
(1)直觉来说,应该将数组进行平方,再快速排序。这种解法的时间复杂度是。
(2)对于一个有序的数组,天然的具有大小顺序。平方后的数组两端是最大的,中间某位置是最小的。这种情况下,可以考虑使用双指针指向两端,比较大小。用第三个指针指向新的空间,将最大的值依次从尾至头填充。因为该题目没有对空间复杂度的要求,因此可以使用新的空间存放排序后的数组。
3. 代码
(1)暴力解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
nums[i] *= nums[i] ;
}
sort(nums.begin(),nums.end());
return nums;
}
};
(2)双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
// 双指针解法
// 数组是一个U字形式排列,最大值一定出现在最左边或是最右边
int len = nums.size();
vector<int> res(len,0);
int ind = len - 1;
// 将平方和排序放到一起运行。算法的复杂度是O(n)。
for (int i = 0, j = len - 1; i<=j; ) {
if (nums[i] * nums[i] > nums[j] * nums[j] ) {
res[ind] = nums[i] * nums[i];
i++;
}
else {
res[ind] = nums[j] * nums[j];
j--;
}
ind--;
}
return res;
}
};
tips
1. 快排
sort(nums.begin(),nums.end())