题目
给你一个按 非递减顺序 排序的整数数组 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]
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 已按 非递减顺序 排序
分析
这道题我们要抓住一个关键信息,那就是原数组是非递减的, 这样的话该数组平方后的最大值一定在这个数组的第一个或者最后一个元素。找到之后我们就可以将最大的元素放到新数组里面最大的位置上,依次类推。
这个时候我们就可以考虑使用双指针法了。
定义一个指针指向数组头元素,再定义一个指针指向数组最后一个元素。如果头元素的平方大于尾元素的平方,将最大值放到新数组最大值的位置上,头指针向前移动一格;反之,尾指针向后退一格。
代码(C语言):
int* sortedSquares(int* nums, int numsSize, int* returnSize){
*returnSize=numsSize; //新数组大小等于原数组大小
int left=0,right=numsSize-1; //创建两个指针,right指向数组最后一位元素,left指向数组第一位元素
int* ret=malloc(sizeof(int)*numsSize); //为新数组分配空间
int i=numsSize-1;
for(i=numsSize-1;i>=0;i--){
if(nums[left]*nums[left]<nums[right]*nums[right]){
//若右指针指向元素平方比左指针指向元素平方大,将右指针指向元素平方放入结果数组。右指针左移一位
ret[i]=nums[right]*nums[right];
right--;
}else{
//若左指针指向元素平方比右指针指向元素平方大,将左指针指向元素平方放入结果数组。左指针右移一位
ret[i]=nums[left]*nums[left];
left++;
}
}
return ret;
}