- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给你一个按 非递减顺序 排序的整数数组 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 已按 非递减顺序 排序
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
解题
使用双指针!
解题思路:由于是存在正负.因此中间的值一定小于两端中的一端.
将双指针指向数组两端,然后平方进行比较,将较大的值放入新数组的尾部,然后该指针向中间一位.直到左右两个指针碰撞完while(x≤y).
public int[] sortedSquares(int[] nums) {
// 双指针的起始位置为数组的左右两端(由于有正负,因此数组中间的值一定小于两端的值)
int x = 0;
int y = nums.length-1;
int[] newNum = new int[nums.length];
int i = nums.length -1;
// 当左指针大于右指针(碰撞后继续执行),循环结束
while (x <= y) {
// 对左右两端的数进行平方比较,大的一个放入新的数组中,并且指针往中间移一位.
int xs = nums[x] * nums[x];
int ys = nums[y] * nums[y];
if (ys > xs) {
//右边的值比较大,将右边的值放入新数组,并且指针向前移
newNum[i] = ys;
y --;
} else {
newNum[i] = xs;
x ++;
}
i --;
}
return newNum;
}