1. question: 有序数组的平方(简单)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/squares-of-a-sorted-array
示例 1:
1 2 3 4
| 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
|
示例 2:
1 2
| 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
|
提示:
1 2 3
| 1 <= nums.length <= 104 -104 <= nums[i] <= 104 nums 已按 非递减顺序 排序
|
2. answers
这道题最直接的思路就是先平方,然后排序。时间复杂度取决于排序算法。空间复杂度为O(1)。代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class Solution_0055 {
public static int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) { nums[i] = nums[i] * nums[i]; }
Arrays.sort(nums);
return nums;
}
public static void main(String[] args) {
int[] nums = {-4,-1,0,3,10};
int[] result = sortedSquares(nums);
for(int item: result) System.out.print(item + "\t"); } }
|
但是,无论怎么排序,时间复杂度肯定大于O(n)。仔细分析,原始数组是有序的,可能存在负数,所以说,平方后的数组,最大值一定是在两侧的。如果有负数,那么就是两边大、中间小。如果均为正数或者均为负数,那么就是一侧大一侧小。无论如何,最大值一定在两侧取到,且次大值依次向里移动。
因此可采用首尾双指针法,向内侧移动,并比较取最大值,赋值给新数组。时间复杂度为O(n),空间复杂度也为O(n)。代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public class Solution_0055_02 {
public static int[] sortedSquares(int[] nums) {
int[] result = new int[nums.length];
int start = 0; int end = nums.length - 1; int index = result.length - 1; int tempResult1 = 0; int tempResult2 = 0;
while(start <= end) {
tempResult1 = nums[start] * nums[start]; tempResult2 = nums[end] * nums[end];
if(tempResult1 < tempResult2) { result[index--] = tempResult2; end--; } else { result[index--] = tempResult1; start++; } }
return result; }
public static void main(String[] args) { System.out.println();
int[] nums = {-7, -3, 2, 3, 11};
int[] result = sortedSquares(nums);
for(int item: result) System.out.print(item + "\t");
} }
|
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。