题目背景
给你一个按 非递减顺序 排序的整数数组 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]
题目思路
最容易想到且最暴力的解法就是先将每个数平方,之后再排个序。
优雅的思路是使用双指针,从两端不断找最大值。
具体代码
理解思路后自己写的版本:
// 977. 有序数组的平方
public int[] sortedSquares(int[] nums) {
int res[] = new int[nums.length];
int left = 0, right = nums.length - 1;
int index = right;
for(int i = 0;i <= nums.length; i++){
int leftMax = (int) Math.sqrt(nums[left]);
int rightMax = (int) Math.sqrt(nums[right]);
if(leftMax > rightMax){
res[index] = leftMax;
left += 1;
}else{
res[index] = rightMax;
right += 1;
}
}
return res;
}
随想录版本(自己写的版本还是有不少不足的):
// 977. 有序数组的平方
public int[] sortedSquares(int[] nums) {
int res[] = new int[nums.length];
int left = 0, right = nums.length - 1;
int index = right;
while(left <= right){
if(nums[left] * nums[left] > nums[right] * nums[right]){
res[index--] = nums[left];
left += 1;
}else{
res[index--] = nums[right];
right -= 1;
}
}
return res;
}
参考资料:977.有序数组的平方