题目
①排序思路
1.对于无规律序列:
可以使用 -> 快速排序(sort函数),冒泡排序。
快排(快速排序)时间复杂度更低(NlogN),而且C++有相应的函数sort
所以更加用快速排序。
2.对于有规律序列:
通过观察 and 积累经验,能够做到效率更高的决策,本题也是有规律的!
②本题排序思路
思路:本题应该对原数组平方,然后对原数组进行排序。
具体排序思路:本题是有序数组,平方后的最大值可能第一个元素,也可能是最后一个元素,换句话说"最大值恒存在数组的两端"
例如:(-10)*(-10)>5*5。
其实也可以看作绝对值进行排序,然后全部平方
(但本题绝对值排序完再平方其实会比较复杂,提出绝对值只是辅助理解)
③双指针实现排序思路
补充:这里指针不是指针类型,而是游标指针
补充:slow和fast是同起点出发,fast指针走的比slow快,本题的left和
right指针是从数组的左右两端出发的。都是双指针,只是表示形式有点不同
Ⅰ:双指针left和right的含义
1.left、right整体的意义:
闭区间[left,right]是原数组未比较过的元素的下标区间,可视作"新数组"
2.left的意义:
"新数组"的第一个元素(可能是负值,可能平方后是最大值)
3.right的意义:
"新数组"的最后元素(原数组是升序,所以可能平方后是最大值)
Ⅱ:双指针具体实现思路
1.最大值恒存在"新数组"的两端
left、right双指针就指向了新数组的两端。
对比nums[left]、nums[right]可得到最大值
根据双指针left、right的含义可知:
1.nums[left]是最大值,left需要右移
2.nums[right]是最大值,right需要左移
2.需要辅助数组存储最大值
本题就无法直接操作原数组,必须借助辅助数组
将对比得到的每个最大值,放入辅助数组里
④具体代码实现
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums)
{
//辅助数组存储最大值
int k=nums.size()-1;
vector<int>ret(nums.size());
//先对原数组平方
for(int i = 0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
int slow = 0;
int fast = nums.size()-1;
while(slow<=fast){
if(nums[slow]<=nums[fast]){
ret[k--]=nums[fast--];
}
else{
ret[k--]=nums[slow++];
}
}
return ret;
}
};