【LeetCode-题目】有序数组的平方
有序数组的平方
题目
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
实例
输入: [-4,-1,0,3,10]
输出: [0,1,9,16,100]
想法
先看看菜鸟三思的思路:
- 将输入先进行平方和
- 然后将剩下结果进行排序
这里是官方题解:
- 由于是非递减顺序的数组,因此可以先寻找一个距离0最近的值
- 根据此值可以将数组分为两部分。后面可以根据归并排序来合并数组
- 归并排序合并数组
- 使用双指针对这两个数组进行遍历
- 优先将绝对值较小的数值放入新数组
- 当某个数组遍历完成后,将剩下数组的数据放入新数组
代码
使用归并排序的代码
class Solution {
public int[] sortedSquares(int[] A) {
int[] B = new int[A.length];
int mid = getMid(A);
int l = mid - 1;
int r = mid + 1;
int ind = 0;
B[ind++] = (int) Math.pow(A[mid], 2);
while (l>=0 && r<A.length) { //左右指针比较
if (Math.abs(A[l]) <= Math.abs(A[r])) { //左边数据较小
B[ind++] = (int) Math.pow(A[l--], 2);
}else { //右边数据较小
B[ind++] = (int) Math.pow(A[r++], 2);
}
}
while (l>=0) { //左边还有剩余数据
B[ind++] = (int) Math.pow(A[l--], 2);
}
while (r<A.length) { //右边数据还有剩余
B[ind++] = (int) Math.pow(A[r++], 2);
}
return B;
}
/**
* 获得最接近0的下标
**/
public int getMid(int[] A) {
int min = Integer.MAX_VALUE;
int ind = 0;
for (int i=0;i<A.length;i++) {
if (min >= Math.abs(A[i])) {
min = Math.abs(A[i]);
ind = i;
}else {
return i-1;
}
}
return ind;
}
}
常言:三思而後行。一思善惡是非,二思公私他己,三思盈虧損余。

浙公网安备 33010602011771号