双指针与滑动窗口简单2 种解法
#977有序数组的平方
将非递减数组的每个元素平方,并返回仍按非递减顺序排列的数组。
#数组#双指针#排序
解题主线
01
平方最大值必在当前区间两端;从结果末尾向前写入较大的端点平方。
解法 1:平方后排序
复制输入,逐项平方后调用标准库排序。
时间复杂度
O(n log n)
空间复杂度
O(n),包含返回数组
java
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) 额外空间,不计返回数组
java
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