LeetCode 977. 有序数组的平方

目录结构

目录结构

1.题目

2.题解

2.1排序

2.2双指针


1.题目

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

示例:

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


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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

2.1排序

将数组每个元素平方,然后排序这个数组。

public class Solution977 {
    public int[] sortedSquares(int[] A) {
        for (int i = 0; i < A.length; i++) {
            A[i] *= A[i];
        }
        Arrays.sort(A);
        return A;
    }
}
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)

2.2双指针

由于原数组已排好序,故可以用两个指针分别读取数组的非负部分与负数部分

  • 指针 i 反向读取负数部分;
  • 指针 j 正向读取非负数部分。

使用两个指针分别读取两个递增的数组(按元素的平方排序)然后合并。

public class Solution977 {
    public int[] sortedSquares(int[] A) {
        int len = A.length, j = 0, p = 0;
        int[] result = new int[len];
        while (j < len && A[j] < 0) {
            j++;
        }
        int i = j - 1;

        while (i >= 0 && j < len) {
            if (A[i] * A[i] < A[j] * A[j]) {
                result[p++] = A[i] * A[i];
                i--;
            } else {
                result[p++] = A[j] * A[j];
                j++;
            }
        }

        while (i >= 0) {
            result[p++] = A[i] * A[i];
            i--;
        }
        while (j < len) {
            result[p++] = A[j] * A[j];
            j++;
        }

        return result;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

你可能感兴趣的:(LeetCode)