赞
踩
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-arrows-to-burst-balloons
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
452.在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
// 比较函数,用于对气球进行排序 int cmp_int(const void* _a , const void* _b) { return (*(int**)_a)[0] - (*(int**)_b)[0]; } int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){ // 对气球按起始坐标进行排序 qsort(points, pointsSize, sizeof(int*), cmp_int); if (pointsSize == 0) //没有气球就不需要弓箭 return 0; *pointsColSize = 2; int res = 1; //有气球的话至少需要一支弓箭 for (int i = 1; i < pointsSize; i++) { // 如果某个气球的左边界大于前面一组重叠气球的最小右边界,这需要弓箭数要加1 if (points[i][0] > points[i - 1][1]) res++; else // 如果当前气球的左边界不大于前面一组重叠气球的最小右边界的话,说明当前气球跟前面一组重叠气球也是重叠的,更新这一组重叠气球的最小右边界确保能够用一支弓箭射爆这一组气球 points[i][1] = points[i - 1][1] >= points[i][1] ? points[i][1] : points[i - 1][1]; } return res; }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。