Java Arrays.sort方法重写在LeetCode里踩的坑
今天刷LeetCode的时候,刷到一道题《452. 用最少数量的箭引爆气球》,里面用到二维数组对列升序排列的语句,
class Solution {
public int findMinArrowShots(int[][] points) {
if (points.length == 0)
return 0;
Arrays.sort(points, new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return a[1] - b[1];//这里存在风险
}
});
int pos = points[0][1];
int arrs = 1;
for(int[] b : points){
if(b[0] > pos){
pos = b[1];
++arrs ;
}
}
return arrs;
}
}
在这里我重写方法是利用a[1] - b[1]
来控制升序,但这算法对于输入数据[[-2147483646,-2147483645],[2147483646,2147483647]]得到的结果是错误的,经过分析发现,是由于java里int最大值只有2147483647,如果将这两个直接相减是会发生溢出的,因此通过两式相减来控制升序的方法是可能发生问题的,于是改成如下控制方法:
if (a[1] > b[1]) {
return 1;
} else if (a[1] < b[1]) {
return -1;
} else {
return 0;
}
}
这样就没有问题了。