Leetcode452. 用最少数量的箭引爆气球(C语言)
算法-贪心思想:算法与数据结构参考
题目:
在二维空间 中有许多球形的气球。每个气球提供的输入是水平方向上气球直径的开始和结束坐标(xstart,xend)。在坐标x处射出一支箭(可以沿着x轴从不同点完全垂直地射出),若满足 xstart ≤ x ≤ xend,则该气球会被引爆。要求找到使得所有气球全部被引爆,所需的弓箭的最小数量。例:
输入:[[10,16], [2,8], [1,6], [7,12]]
输出:2
解释:可以在x = 6(射爆[2,8],[1,6]两个气球)和 x = 11(射爆另外两个气球)。
思路:
先排列,找最小重合区间/点,若无最小重叠区间,则arrow计数,区间后移。
代码:
int cmp(int *a,int *b){
return (*(int**)a)[0]-(*(int**)b)[0];
} //从小到大排列。按第一个元素;若相等,按第二个元素
int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
if(!points || pointsSize==0) return 0;
qsort(points,pointsSize,sizeof(points[0]),cmp);
int start=points[0][0];
int end=points[0][1];
int arrow=1; //初始化引爆气球的开始结束区间,以及箭的数量
for(int i=1;i<pointsSize;i++){ //有重合点
if(points[i][0]<=end){ //'='即取到区间边界的点
start=points[i][0];
if(points[i][1]<end)
end=points[i][1];
}
else{ //无重合点,arrow计数,后移区间
arrow++;
start=points[i][0];
end=points[i][1];
}
}
return arrow;
}