有序数组的平方

LeetCode每日一题,538. Squares of a Sorted Array

先看题目描述

大意就是给定一个有序数组,让我们返回各数的平方和,以升序的顺序返回

算法和思路

直接排序法

这个是最容易想到的思路,将数组中各数平方以后,再返回排序后的数组

双指针法

上一个方法虽然很容易想到,但没有利用数组有序的特点,我们可以利用该点,使用双指针法,实现更好的效率,这个方法有点借助了归并排序的思想

算法流程:

  • 初始时定义两个指针 i 和 j 分别指向位置 0 和 len - 1
  • 每次比较 i 和 j 两个指针对应的数,选择平方后较大的那个数逆序放入答案数组中并移动指针(若指针 i 指向的数大于 0,则直接将指针 j 对应的数逆序放入答案数组中,并移动 j 指针)
  • 重复上述过程直至 i 指针和 j 指针相遇
  • 最后返回答案数组

算法源码

直接排序法

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Arrays;

class Solution {
public int[] sortedSquares(int[] A) {
int len = A.length;
for (int i = 0; i < len; i++) {
A[i] = A[i] * A[i];
}
Arrays.sort(A);
return A;
}
}

双指针法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int[] sortedSquares(int[] A) {
int len = A.length;
int[] ans = new int[len];
int pos = len - 1;
for (int i = 0, j = len - 1; i <= j;) {
if (A[i] >= 0) {
ans[pos] = A[j] * A[j];
j--;
continue;
} else if (A[i] * A[i] > A[j] * A[j]) {
ans[pos] = A[i] * A[i];
i++;
} else {
ans[pos] = A[j] * A[j];
j--;
}
pos--;
}
return ans;
}
}