力扣977. 有序数组的平方(双指针技巧)
Problem: 977. 有序数组的平方
文章目录
- 题目描述
- 思路
- Code
题目描述
思路
由于数组是非递减且包含正、负数,则假如我们将数组中的每一个元素取平方并且将其从原始的某一个位置分开成两个数组来看待(一个数组从前往后看,一个数组从后往前看)则这两个数组均为递减数组,此时我们再分别用两个指针指向原始数组的开头和结尾,每次比较取出平方数较大的存放在一个结果数组中(从后往前存放保证递增的特性)
时间复杂度:
O ( n ) O(n) O(n);
空间复杂度:
O ( 1 ) O(1) O(1);
Code
class Solution {
public int[] sortedSquares(int[] nums) {
int p1 = 0;
int p2 = nums.length - 1;
int p = nums.length - 1;
int[] res = new int[nums.length];
while (p1 <= p2) {
int leftSquare = nums[p1] * nums[p1];
int rightSquare = nums[p2] * nums[p2];
if (leftSquare >= rightSquare) {
res[p] = leftSquare;
p1++;
} else {
res[p] = rightSquare;
p2--;
}
p--;
}
return res;
}
}