目录
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表.
前言
今日文案:
其实,余生并不长,做喜欢的事情,在一个正当好的人,东有飘雪,夏有凉风,以美好的心态对待每一天,尽量把遗憾降到最低,如此才是不辜负自己。
一、无重叠区间
给定一个区间的集合 intervals
,其中 intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠
贪心思路:
我们只需要找出单独的区间有多少个,然后总数减去单独区间就是要去掉的区间。
右边界排序,每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大),所以第一条分割线就是区间1结束的位置。
class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b)
{
return a[1]<b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int count=1;
sort(intervals.begin(),intervals.end(),cmp); //右边界升序排序
int end=intervals[0][1]; //初始化
for(int i=1;i<intervals.size();i++)
{
if(end<=intervals[i][0]) //如果是单独区间
{
end=intervals[i][1]; //右边界推进
count++; //数量加1
}
}
return intervals.size()-count;
}
};
二、划分字母区间
字符串 S
由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表.
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27]={0};
vector<int>res;
for(int i=0;i<s.size();i++)
{
hash[s[i]-'a']=i; //哈希记录字母出现的最远的值
}
int right=0;
int left=0;
for(int i=0;i<s.size();i++)
{
right=max(right,hash[s[i]-'a']); //right记录当前字母区间的最远值
if(i==right) //相等的时候就是找到了当前字母区间最远值
{
res.push_back(right-left+1); //保存长度
left=right+1; //更新起始位置
}
}
return res;
}
};
四、合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间
class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b)
{
return a[0]<b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size()==1||intervals.size()==0)
{
return intervals;
}
sort(intervals.begin(),intervals.end(),cmp); //右边界排序
int right=intervals[0][1]; //初始化
int left=intervals[0][0];
int flag=0;
vector<vector<int>> res;
vector<int>path;
for(int i=1;i<intervals.size();i++)
{
flag=0;
while(i<intervals.size()&&right>=intervals[i][0]) //右边界关系
{
right=max(right,intervals[i][1]); //更新区间
left=min(left,intervals[i][0]);
i++; //直接跳下一个
}
res.push_back({left,right}); //插入
if(i<intervals.size()) //准备退出辽
{
left=intervals[i][0]; //最后记录一波
right=intervals[i][1];
flag=1; //记下标志
}
}
if(flag)
res.push_back({left,right}); //插入,否则会漏一个
return res;
}
};
总结
1、关键是记录单个区间的值,右边界排序后,删最小右边界,右边会有更大空间。
2、用哈希来记录最长延长距离
3、排序后,分清记录值。