给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
很明显这个题也可以暴力解法循环,就不这样写了,当然也可以偷懒用库函数,先平方后排序也很简单。
用双指针的话,先考虑这个数组本身,它是有序排列的,平方了之后,我们可以想想数组的值是怎样的?它的最小值不一定在两边,但是最大值肯定是在两边的,只是左边或者右边的问题。那就两个指针同时往中间移动即可,两边的最先开始比较,比较大小之后最大值直接就确定了,然后用新指针去指代新数组的最大下标即可,然后刚刚判断出来的那个元素就可以向下一位移动了。
然后一次类推:
class Solution
{
public:
vector<int> sortedSquares(vector<int> &nums)
{
vector<int> result(nums.size(), 0);
int k = nums.size() - 1;
// 首先是ij是否相等的问题,如果这里是不相等那么遇到一个相等的值那么循环就推出了然后就是循环后的条件为空
// 这里的i和j的加减是建立在两数相比的情况下的
for (int i = 0, j = nums.size() - 1; i <= j;)
{
if (nums[i] * nums[i] > nums[j] * nums[j])
{
result[k] = nums[i] * nums[i];
i++;
k--;
}
else
{
result[k] = nums[j] * nums[j];
j--;
k--;
}
}
return result;
}
};