【题目描述】
给你一个按 非递减顺序 排序的整数数组 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]
【提示】
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 已按 非递减顺序 排序
【进阶】
- 请你设计时间复杂度为
O(n)
的算法解决本问题
解题思路
- 暴力解法:先让数组里面的元素进行平方运算,然后使用
sort()
进行排序。 - 双指针法:该方法的核心就是:原数组使用递增顺序排列,最大的平方数一定出现在最左边或最后边,筛选出最大的平方数后进行指针的移动,如此循环往复。需要注意的是:记得复习一下
vector
的初始化操作。
暴力解法
// 使用到了sort算法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i] = nums[i] * nums[i]; //很尴尬,这种方式反而更快
}
sort(nums.begin(),nums.end(),less<int>()); // 从小到大排列vector
return nums;
}
};
双指针法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int New_Index = nums.size() - 1; // 按照递增顺序排列新vector,所以先从最后一个元素开始更新
vector<int> temp(nums.size(), 0); //这里要初始化这个vector,不然如果直接赋值的话肯定会出错
//定义左指针和右指针,左指针向右边移动,右指针向左边移动;越界则终止循环。符号一定是“<=”,否则会出错
for(int Left_Index=0,Right_Index = nums.size() - 1;Left_Index<=Right_Index; ){
// 右指针的平方数更大,记录下来并更新指针
if(nums[Right_Index]*nums[Right_Index] > nums[Left_Index]*nums[Left_Index]){
temp[New_Index--] = nums[Right_Index]*nums[Right_Index];
Right_Index --;
// 左指针的平方数更大,记录下来并更新指针
}else{
temp[New_Index--] = nums[Left_Index]*nums[Left_Index];
Left_Index ++;
}
}
return temp;
}
};