1、第二维升序排序(436ms,24%;99.9MB,12%)
1 int findMinArrowShots(vector<vector<int>>& points) { 2 if (points.empty()) { 3 return 0; 4 } 5 //对向量的第二维进行升序排序,如示例1排序后变为: 6 //[1,6],[2,8],[7,12],[10,16] 7 sort(points.begin(), points.end(), [](const vector<int>& R, const vector<int>& L) { 8 return R[1] < L[1]; 9 }); 10 //初始化为第一个范围的右值 11 int tail = points[0][1]; 12 //记录箭的个数,非空至少需要一只箭 13 int sum = 1; 14 //遍历二维向量,每次得到一个一维向量(一个范围) 15 for (const vector<int> po: points) { 16 //po[0]是范围左值,用后一个范围的左值和前一个范围的右值比较 17 //若是if成立,意味着两者是不重叠的,需要一支新的箭,即sum++ 18 if (po[0] > po) { 19 //[1]是右值 20 tail = po[1]; 21 ++sum; 22 } 23 } 24 return sum; 25 }
2、第一维升序排序(372ms,64%;87.6MB,66%)
1 int findMinArrowShots(vector<vector<int>>& points) { 2 if(points.empty()){ 3 return 0; 4 } 5 //对向量第一维进行升序排序 6 sort(points.begin(),points.end(),[](const auto& R,const auto& L){return R[0]<L[0];}); 7 //记录箭的数量,非空则最少需要一只箭 8 int sum=1; 9 //后一个范围的左值和前一个范围的右值比较 10 for(int i=0;i<points.size()-1;i++){ 11 //成立意味着两者不重叠,需要增加一只箭并开始新一轮比较 12 if(points[i+1][0]>points[i][1]){ 13 sum++; 14 continue; 15 } 16 //没成立说明两者重叠了,取两者右值小的那个作为下一轮比较对象 17 //重叠的话必须要满足箭从最小值处射出 18 points[i+1][1]=min(points[i+1][1],points[i][1]); 19 } 20 return sum; 21 }
3、第一维升序排序(448ms,21%;87.7MB,28%)
1 int findMinArrowShots(vector<vector<int>>& points) { 2 if (points.empty()) { 3 return 0; 4 } 5 //对数组的第一维进行升序排序,如示例1排序后变为: 6 //[1,6],[2,8],[7,12],[10,16] 7 sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>& v) { 8 return u[0] < v[0]; 9 }); 10 // points 不为空至少需要一支箭 11 int result = 1; 12 //注意细节:i为1 13 for (int i = 1; i < points.size(); i++) { 14 // 成立意味着两者不重叠,因为下一范围的左值大于上一范围的右值 15 if (points[i][0] > points[i-1][1]) { 16 result++; // 需要新增一支箭 17 } 18 //else意味着两者重叠,取范围右值小的作为下一轮比较对象 19 else { 20 // 更新重叠气球最小右边界 21 points[i][1] = min(points[i-1][1], points[i][1]); 22 } 23 } 24 25 return result; 26 }
浙公网安备 33010602011771号