欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 贪心算法 part04

贪心算法 part04

2025/5/10 17:11:56 来源:https://blog.csdn.net/2403_88990400/article/details/144293283  浏览:    关键词:贪心算法 part04

文章参考来源代码随想录

452. 用最少数量的箭引爆气球

局部最优:用一支箭尽可能多的射重叠的气球

全局最优:用最少数量的箭射气球

这里先排序,因为给定的数组必定有一个气球。所以箭总数初始化为1

判断两个气球是否重叠:

points[i][0]>points[i-1][1](不重叠)

两个气球重叠之后判断第三个气球是否重叠:

这里可以使用更新第二个气球右边界处理

class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[0]<b[0];}int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(),points.end(),cmp);int result=1;for(int i=1;i<points.size();i++){if(points[i][0]>points[i-1][1])result++;else{points[i][1]=min(points[i][1],points[i-1][1]);}}return result;}
};

435. 无重叠区间

本题使用右边界排序

从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了

 这里我们初始化非重叠区间数量为1

再定义一个区间分割点,当当前区间分割点小于下一个区间左边界时更新为下一个区间的右边界,此时说明两区间没有重叠,所以计数器往上加一。

class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),cmp);int count=1;// 记录非交叉区间的个数int end=intervals[0][1];for(int i=1;i<intervals.size();i++){if(end<=intervals[i][0]){end=intervals[i][1];count++;}}return intervals.size()-count;}
};

 763.划分字母区间

用一个计数数组记录每一个字母最后出现的位置。

从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

class Solution {
public:vector<int> partitionLabels(string s) {int hash[27]={0};for(int i=0;i<s.size();i++)hash[s[i]-'a']=i;int right=0;int left=0;vector<int>result;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=right+1;}} return result;}
};

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词