题目997 有序数组的平方
我的思路:
肯定是挨个平方然后再sort排序呗。
写代码时候居然忘了sort怎么用。。。
import java.util.Arrays; 这个包里面,sort括号里面直接放需要排序的数组就行。
class Solution {
public int[] sortedSquares(int[] A) {
int[] noSortedB = new int[A.length];
for (int i = 0; i < A.length; i++) {
noSortedB[i] = A[i] * A[i];
}
Arrays.sort(noSortedB);
return noSortedB;
}
}
官方思路:
双指针 为啥会想到双指针呢??? 双指针好像在很多地方都用得到。
官方说:因为给的数组A是已经排序过的,所以,可以分成比0大的和比0小的两个数组,
左边比0小,那越靠左边的平方就越大对吧,右边比0大,那约靠右边的平方就越大,
所以两头的肯定是分别最大的,比较一下哪个更大就是整个数组里最大的了,放到数组末尾,然后再移动指针再比较。
妙啊~
记住了以后需要排序的,先想想能不能用双指针,因为各种复杂度都会比单指针低。
其实下面的方法不需要分大于零或者小于0,直接双指针挨个比较就完事了。
class Solution {
public static int[] sortedSquares(int[] A) {
// 双指针,先建两个指针
// 再新建个B的指针指向末尾元素
int leftPoint = 0;
int rightPoint = A.length - 1;
int pointOfB = A.length - 1;
// 比较两个指针的平方大小,把大的放到新数组末尾,首先新建个新数组
int[] resultB = new int[A.length];
while (leftPoint <= rightPoint) {
if (A[leftPoint] * A[leftPoint] >= A[rightPoint] * A[rightPoint]) {
resultB[pointOfB] = A[leftPoint] * A[leftPoint];
leftPoint++;
} else {
resultB[pointOfB] = A[rightPoint] * A[rightPoint];
rightPoint--;
}
pointOfB--;
}
return resultB;
}
}