双指针与滑动窗口简单2 种解法

#977有序数组的平方

将非递减数组的每个元素平方,并返回仍按非递减顺序排列的数组。

#数组#双指针#排序

解题主线

01

平方最大值必在当前区间两端;从结果末尾向前写入较大的端点平方。

解法 1平方后排序

复制输入,逐项平方后调用标准库排序。

时间复杂度

O(n log n)

空间复杂度

O(n),包含返回数组

977. 有序数组的平方 · 平方后排序
import java.util.Arrays;

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

复制输入,逐项平方后调用标准库排序。

解法 2首尾双指针

比较左右端绝对值,把较大平方写入结果当前末位。

时间复杂度

O(n)

空间复杂度

O(1) 额外空间,不计返回数组

977. 有序数组的平方 · 首尾双指针
final class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];
        int left = 0, right = nums.length - 1;
        for (int write = nums.length - 1; write >= 0; write--) {
            int leftSquare = nums[left] * nums[left];
            int rightSquare = nums[right] * nums[right];
            if (leftSquare > rightSquare) {
                result[write] = leftSquare;
                left++;
            } else {
                result[write] = rightSquare;
                right--;
            }
        }
        return result;
    }
}

比较左右端绝对值,把较大平方写入结果当前末位。

边界与易错点

  • 负数平方会改变原有顺序。
  • 双指针结果写入方向必须从大到小,否则还需额外反转。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

easy/Q977_sortedSquares.java