1、题目:有序数组的平方
2、解题思路
如果有正负数的存在,直接平方的话数组会出现两端大中间小的情况,所以我们只需要找到正负数的交界处,然后使用双指针的思想将数据进行从小到大的排序。
但是还有更加巧妙的想法,就是将双指针分别指向数组的首尾的位置,然后也是一样从大到小进行排序,这样就不需要进行寻找正负交界这个步骤。
3、代码
//双指针
class Solution
{
public:
vector<int> sortedSquares(vector<int>& nums)
{
//寻找中间值
int n = nums.size();
int negative = -1;
for (int i = 0; i < n; ++i)
{
if (nums[i] < 0)
{
negative = i;
}
else
{
break;
}
}
vector<int> ans;
int i = negative, j = negative + 1;
while (i >= 0 || j < n)
{
if (i < 0)
{
ans.push_back(nums[j] * nums[j]);
++j;
}
else if (j == n)
{
ans.push_back(nums[i] * nums[i]);
--i;
}
else if (nums[i] * nums[i] < nums[j] * nums[j])
{
ans.push_back(nums[i] * nums[i]);
--i;
}
else
{
ans.push_back(nums[j] * nums[j]);
++j;
}
}
return ans;
}
};
//双指针优化
class Solution
{
public:
vector<int> sortedSquares(vector<int>& nums)
{
int n = nums.size();
vector<int> ans(n);
for (int i = 0, j = n - 1, pos = n - 1; i <= j;)
{
if (nums[i] * nums[i] > nums[j] * nums[j])
{
ans[pos] = nums[i] * nums[i];
++i;
}
else
{
ans[pos] = nums[j] * nums[j];
--j;
}
--pos;
}
return ans;
}
};