题目
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
给你一个按 非递减顺序 排序的整数数组 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=endvoid 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)
总结
初始看到要使用双指针,自己以为是使用双指针来交换平方后的两个元素,但正确的代码思路并不是这样的,正确的代码思路更清晰明了