当前位置: 首页 > news >正文

26.贪心算法4

最少的箭引爆气球

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        int n=points.size();
        int res=1;
        sort(points.begin(),points.end(),
        [](const vector<int> &a,const vector<int> &b){
            return a[0]<b[0];
        }
        );
        for(int i=1;i<n;i++){
            if(points[i-1][1]>=points[i][0]){
                if(points[i-1][1]<points[i][1])
                points[i][1]=points[i-1][1];
                continue;
            }
            res++;
        }
        return res;
    }
};

无重叠区间

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& points) {
        int n=points.size();
        int res=1;
        sort(points.begin(),points.end(),
        [](const vector<int> &a,const vector<int> &b){
            return a[0]<b[0];
        }
        );
        for(int i=1;i<n;i++){
            if(points[i-1][1]>points[i][0]){
                if(points[i-1][1]<points[i][1])
                points[i][1]=points[i-1][1];
                continue;
            }
            res++;
        }
        return n-res;
    }
};

和上一题代码几乎一模一样,除了开闭区间和结果返回

切割字符串

class Solution {
public:
    vector<int> partitionLabels(string s) {
        unordered_map<char,vector<int>> interns;
        for(int i=0;i<s.size();i++){
            if(interns[s[i]].empty()){
                interns[s[i]]=vector<int>(2,0);
                interns[s[i]][0]=interns[s[i]][1]=i;
            }else {
                interns[s[i]][1]=i;
            }
        }
        vector<pair<char,vector<int>>> vec(interns.begin(),interns.end());
        sort(vec.begin(),vec.end()
        ,[](const pair<char,vector<int>>& a,const pair<char,vector<int>>& b ){
            return a.second[0]<b.second[0];
        }
        );
        vector<int> res;
        int cur=0;
        for(int i=1;i<vec.size();i++){
            if(vec[i].second[0]>vec[i-1].second[1]){
                res.push_back(vec[i-1].second[1]-cur+1);
                cur=vec[i].second[0];
            }else if(vec[i].second[1]<vec[i-1].second[1]){
                vec[i].second[1]=vec[i-1].second[1];
            }
        }
        res.push_back(s.size()-cur);
        return res;
    }
};

上面那种做法太冗余了,我们需要的信息其实只有结尾

class Solution {
public:
    vector<int> partitionLabels(string S) {
        int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置
        for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
            hash[S[i] - 'a'] = i;
        }
        vector<int> result;
        int left = 0;
        int right = 0;
        for (int i = 0; i < S.size(); i++) {
            right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界
            if (i == right) {
                result.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return result;
    }
};

相关文章:

  • Vue 路由基础:Vue 2 和 Vue 3 的比较与使用
  • APP自动化实战
  • c++ 三维图形 R树的简单应用案例
  • 鸿蒙5.0实战案例:基于RichEditor的评论编辑
  • 鸿道Intewell操作系统的Linux实时拓展方案
  • 组态软件在物联网中的应用
  • TFChat:腾讯大模型知识引擎(DeepSeek R1)+飞书机器人实现AI智能助手
  • Java中的缓存技术:Guava Cache vs Caffeine vs Redis
  • w803|联盛德|WM IoT SDK2.X测试|window11|VSCODE|(4):IDE配置
  • Spark内存迭代计算
  • .Net 9下使用Tensorflow.net---DNN_Eager
  • RabbitMQ死信队列
  • 「云原生」「云原生应用的构建与部署」
  • 阻抗和电阻
  • Linux提权之docker提权(十三) 链接第八篇完整版
  • 如何在docker上部署java服务
  • 学习路之PHP --TP6异步执行功能 (无需安装任何框架)
  • Linux 日志系统·
  • 蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
  • Linux提权之详细总结版(完结)
  • 网站开发款计入什么科目/百度产品大全首页
  • 有需求或做任务赚钱的网站么/贵州seo培训
  • 网站备案号查询/重庆疫情最新数据
  • 网站建设厦门/百度官方优化指南
  • 大连网站代运营的公司有哪些/北京seo方法
  • 手机网站链接微信/seo优化培训