题目
题目链接:977有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
}
};
思路及代码
双指针
题目解析:
- 数组非递减,
- 元素有正负 -> 元素平方后的结果(新数组)不是有序的,
- 输出要求:数组非递减,要有序
实现方法: 双指针
- 指针
i
指向起始位置,指针j
指向终止位置 - 定义一个新数组
result
,和nums
数组大小一样,让k
指向result
数组的终止位置。 - 如果
nums[i]*nums[i] > nums[j]* nums[j]
,则result[k--] = nums[i] * nums[i]
- 如果
nums[i]*nums[i] <= nums[j]* nums[j]
,则result[k--] = nums[j] * nums[j]
#include <vector>
#include <iostream>
using namespace std;
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> result(nums.size(), 0);
for(int i = 0, j = nums.size() - 1; i <= j;){
if(nums[i]*nums[i] > nums[j]* nums[j]){
result[k] = nums[i] * nums[i];
k--;
i++;
}else{
result[k] = nums[j]*nums[j];
k--;
j--;
}
}
return result;
}
};
// @lc code=end
void printVector(vector<int>& nums){
for(int i = 0; i < nums.size(); i++){
cout << nums[i] << " ";
}
cout << endl;
}
int main() {
Solution obj;
vector<int> vec = {-4,-3,-1,0,2,3,6,10};
vector<int> res = obj.sortedSquares(vec);
printVector(res);
}
时间复杂度:O(n)
总结
初始看到要使用双指针,自己以为是使用双指针来交换平方后的两个元素,但正确的代码思路并不是这样的,正确的代码思路更清晰明了