题目要求:返回有序数组每个元素的平方,同时也要求有序排列
存在问题:此数组中可能有负数存在
方法一:先进行平方,然后进行快排(时间复杂度为O(nlogn))
方法二:双指针
思路:此数组平方后大小关系一定是从两边向中间减小!!!故两个指针逐步向中间并拢即可,由于题目要求是由小到大排列,故我们可以将数组下标由大到小更新
代码实现:
vector<int> result
k = numsize - 1(新数组由大到小更新)
for(i=0,j=numsize-1;i<=j;)(i和j相等时元素也要更新,故有等号)(参数增加放在循环体里)
{
if(pow(num[i],2)>pow(num[j],2)
{
result(k)=pow(num[i],2);
k--;i++;
}
else
{
result(k)=pow(num[j],2);
k--;j--;
}
}
return result;
leetode实战:
同样,使用双指针也可以从中间开始,从中间正负数分界线开始,类似归并排序,选择较小的放入数组即可
最后为暴力解法