贪心算法4用最少数量的箭引爆气球
Posted 念奕玥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法4用最少数量的箭引爆气球相关的知识,希望对你有一定的参考价值。
leetcode 452 用最少数量的箭引爆气球
此题与 455 分发饼干异曲同工。
解决思路:
贪心策略:从第一个气球开始找,只要能有1支箭的就不多用,1支箭完成不了的再用下一支箭。
把所有气球的范围在同一条横轴上画出来更易理解。
判断能不能用同一支箭(气球有没有重叠):气球
i
+
1
i+1
i+1的左边界小于等于气球
i
i
i的右边界
过程:
首先对气球按右边界的大小进行升序排序。然后选标准(与哪一个气球进行比较算是相重叠),右边界设置为标准的右边界。
先以第一个气球为标准,与第一个气球有重叠的气球,可共用一支箭。直到遇到无重叠的气球,再以该无重叠的气球为标准,使用下一支箭。直到遍历完所有气球结束。
class Solution {
public int findMinArrowShots(int[][] points) {
int n = points.length;
if(n==0) return 0;
//首先对气球按右边界的大小进行升序排序
Arrays.sort(points,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2){
// 直接return o1[1]-o2[1]的话,
// [[-2147483646,-2147483645],[2147483646,2147483647]]会过不了
return Integer.compare(o1[1],o2[1]);
}
});
int right = points[0][1];//第一个气球的右边界
int count =1;//箭的数量(设置的右边界的数量)
for(int i=1;i<n;i++){
//下一个气球的左边界小于等于现在的右边界,则无操作。
if(points[i][0]>right){//若下一个气球的左边界大于现在的右边界,则无重叠
//更新右边界
right=points[i][1];
//箭的数量+1
count++;
}
}
return count;
}
}
以上是关于贪心算法4用最少数量的箭引爆气球的主要内容,如果未能解决你的问题,请参考以下文章