夏天吃辣椒

导航

 

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     }

 

posted on 2021-11-05 11:03  夏天吃辣椒  阅读(37)  评论(0)    收藏  举报