又是一道双指针的题目,上一篇的双指针是快指针赋值给慢指针(快慢指针赋值),现在这篇是首尾两指针相互比较后,取大的赋值给新的数组。
话不多说,上号: 977.有序数组的平方
题目
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
关键点
- 原来的数组本来是有序的,因为越往左边越负,越往右边越正,越中间的越靠近0,因此中间的平方是最小的,最左边或者最右边的平方是最大的
- 用首尾两指针分别计算各自平方后的数,两两比较后取大的放入新数组,新数组的元素从最右边开始往左边排,这就保证了新数组是升序的。
- 话说是指针,其实都是数字下标,首指针 i 是0,尾指针 j 是数组大小减一(即最后一个元素的下标),还需要新数组的下标 k (也是数组大小减一)
- 新数组元素赋值后,新数组的下标 k 要往下移一位,占新坑,方便下次循环后首尾指针直接赋值。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size()-1; //新数组的下标 k,一开始指向最右边的位置
vector<int> result(nums.size(),0); //定义新数组,赋值初始值0
for(int i =0, j = nums.size()-1; i <= j;){ //注意这个for循环的写法
if(nums[i] * nums[i] < nums[j] * nums[j]) {
result[k] = nums[j] * nums[j];
k--; //新数组完成上面的赋值操作后,往下走一位占新坑
j--; //尾指针是往左移的
}
else if(nums[i] * nums[i] >= nums[j] * nums[j]){ //注意这里的=是有意义的,就是第一个元素
result[k] = nums[i] * nums[i];
k--; //新数组完成上面的赋值操作后,往下走一位占新坑
i++; //首指针是往右移的
}
}
return result; //返回的是新开辟的数组
}
};