2023/3/8 每日代码第五天
针对本题,我们首先想到的是这两天弄得双指针算法,这里用双指针的思想是:首先单独开辟出一个存放结果的数组来,然后以left为左指针,以right作为右指针,因为原数组已经有序,所以平方后最大的一定是两边的。以此我们分别从两边出发,来寻求最大值,放入到结果数组中。
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
// 快慢指针
int num=nums.size()-1;
vector<int>re(nums.size(),0); //定义一个结果数组
for(int left=0,right=nums.size()-1;left<=right;)
{
if(nums[left]*nums[left]<=nums[right]*nums[right])
{
re[num--]=nums[right]*nums[right];
right--;
}
else
{
re[num--]=nums[left]*nums[left];
left++;
}
}
return re;
}
};
解法二:即常规思想,先进行平方后,在进行排序,排序平均效能最好的当属快速排序,借此提也可以训练下快速排序。
代码:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
// 快排
for(int i=0;i<nums.size();i++)
{
int tt=nums[i]*nums[i];
nums[i]=tt;
}
Quick_sort(nums,0,nums.size()-1);
return nums;
}
private:
void Quick_sort(vector<int>&nums,int begin,int end)
{
if(begin>end)
return;
int i=begin,j=end;
int temp=nums[begin];
while(i!=j)
{
while(nums[j]>=temp&&j>i) //右边的大于标记位
j--;
while(nums[i]<=temp&&j>i)
i++;
if(j>i)
{
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
}
nums[begin]=nums[i];
nums[i]=temp;
Quick_sort(nums,begin,i-1);
Quick_sort(nums,i+1,end);
}
}
;