977. 有序数组的平方
题目在文末
思路
暴力解法或者用工具类(Arrays.sort)就不写了,考算法是要自己去实现的
双指针
分析:这个数组在取平方之前,是有序的,那么它绝对值最大的数一定是在两端的。
所以可以定义头尾两个指针,一个指向最左端,一个指向最右端,比较两者平方的大小,大的平方放入结果数组
具体细节我都有注释 可以看代码中的注释
class Solution {
public int[] sortedSquares(int[] nums) {
int length = nums.length;
// 结果数组
int[] result = new int[length];
// 用于存入结果数组的指针(题目要求升序,从尾部存)
int r = length-1;
// 头尾指针
int left = 0;
int right = length-1;
while (left<=right){
int leftRes = (int) Math.pow(nums[left],2);
int rightRes = (int) Math.pow(nums[right],2);
//说明:相等的情况无需考虑 随便存一个之后 继续下一次比较就好
if (leftRes <= rightRes) {
//右边大/相等
result[r] = rightRes;
right--;
} else {
//左边大
result[r] = leftRes;
left++;
}
//不要忘记移动结果数组的指针
r--;
}
return result;
}
}