「这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战」。
有序数组的平方
题目描述
给你一个按非递减顺序排序的整数数组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]
解法一 : 直接排序
思路 :
暴力解法:
最简单的方法就是将数组nums
中的数平方后直接排序。 遍历数组中每个元素然后对每个元素求其平方,用数组进行排序。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int length=nums.length;
//构建存储nums数组各个元素平方和的新数组
int[] target = new int[length];
//遍历每个数组元素,然后求对应元素的平方和
for (int i = 0; i < length; i++) {
target[i] = nums[i] * nums[i];
}
//对新数组进行排序即可
Arrays.sort(target);
return target;
}
}
解法二 : 双指针
思路 :
数组原本是有序的, 只是在平方之后就变得无序了, 归根结底就是负数平方之后可能成为最大数了, 但是数组平方 的最大值只会存在数组的两个极端, 不是最左边就是最右边.
举例 :
- 当数组为 [ -6,-5,4,7,10 ] , 处理后为 [16,25,36,49,100]
- 当数组为[1,3,4,5,6], 处理后为 [1,9,16,25,36]
- 当数组为[-10,-9,-5,-4,-2], 处理后为 [4,16,25,81,100]
可以发现,无论数组的形式是什么,最大值一定是存在于数组的极端
这样我们就能确定了平方后最大值的位置, 所以用双指针指向数组的两个极端, 必定能找到平方后的最大值, 将其放到新数组末尾, 之后不断向中间移动, 通过比较两个指针平方后的大小, 就能不断地将当前的最大值放入数组的尾部, 直到两个指针相遇为止.
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
//这里将nums.length的值赋给length,后面就不需要在计算nums.length的值了
int length=nums.length;
//定义新数组target
int[] target= new int[length];
//用双指针指向数组的两端,从两端开始遍历,找到平方最大元素放到数组末尾。
//通过比较两个指针平方后的大小,不断地将当前的最大值放入数组的尾部
for (int i = 0, j = length - 1, pos = length - 1; i <= j;) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
target[pos] = nums[i] * nums[i];
i++;
} else {
target[pos] = nums[j] * nums[j];
j--;
}
pos--;
}
return target;
}
}