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]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
//利用非递减顺序,比较两头的平方哪个更大放入数组中
class Solution {
public int[] sortedSquares(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
// 使用双指针从两端向中间遍历
for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
// 比较平方值大小,较大的平方值放在结果数组的末尾
if (nums[i] * nums[i] > nums[j] * nums[j]) {
ans[pos] = nums[i] * nums[i];
++i;
} else {
ans[pos] = nums[j] * nums[j];
--j;
}
--pos;
}
return ans;
}
}
由于该数组本身是一个有序数组,故该数组的最大值应该在两边,最小值在中间,采用双指针法用空间换时间的方式,依次比较两端指针所指向的元素平方值的大小,逆序存入一个新的数组中,最终得到由小到大排序的新数组