LeetCode: 977. 有序数组的平方

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

示例 1:

输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
示例 2:

输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按非递减顺序排序

方法一:排序

思路:

创建一个新的数组,它每个元素是给定数组对应位置元素的平方,然后排序这个数组

public int[] sortedSquares(int[] A) {
     int N = A.length;
     int[] ans = new int[N];
     for (int i = 0; i < N; ++i)
         ans[i] = A[i] * A[i];

     Arrays.sort(ans);
     return ans;
}

时间复杂度为O(NlogN);

空间复杂度为O(N);

方法二:双指针

思路:

因为数组 A 已经排好序了, 所以可以说数组中的负数已经按照平方值降序排好了,数组中的非负数已经按照平方值升序排好了。

使用两个指针分别读取数组的非负部分与负数部分 —— 指针 i 反向读取负数部分,指针 j 正向读取非负数部分。

使用两个指针分别读取两个递增的数组了(按元素的平方排序)。接下来,使用双指针的技巧合并这两个数组。

public int[] sortedSquares(int[] A) {
    int N = A.length;
    int j = 0;
    while (j < N && A[j] < 0)
        j++;
    int i = j-1;

    int[] ans = new int[N];
    int t = 0;

    while (i >= 0 && j < N) {
        if (A[i] * A[i] < A[j] * A[j]) {
             ans[t++] = A[i] * A[i];
             i--;
        } else {
           ans[t++] = A[j] * A[j];
           j++;
        }
    }

    while (i >= 0) {
        ans[t++] = A[i] * A[i];
        i--;
    }
    while (j < N) {
        ans[t++] = A[j] * A[j];
        j++;
    }
    return ans;
}

时间复杂度为O(N);

空间复杂度为O(N);

猜你喜欢

转载自www.cnblogs.com/aoeiuvAQU/p/11204854.html