有序数组的平方(双指针)
题目:
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
思路:
- 首先排除暴力解,依次遍历平方,后排序,排序时间复杂度最低为NlogN。
- 因为是非递减顺序排序的数组,使用两个指针分别指向第一个数和最后一个数,然后进行开平方的比较,大的放入新的数组中,指针向中间移动。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int a = 0;
int n = nums.size();
int b = n - 1;
int i = n - 1;
vector<int> newNums(n);
while(a<=b){
if(nums[a] * nums[a] < nums[b] * nums[b]){
newNums[i--] = nums[b]*nums[b];
--b;
}else{
newNums[i--] = nums[a]*nums[a];
++a;
}
}
return newNums;
}
};
- 这道题出现了很多未知错误,但最终还是一一解决,根本原因还是对语法的不熟悉。
- int b,i = n - 1; 其中只给i赋值,b不赋值。
- 新建的vector容器要说明大小,不然需要push_back才能放入数。