目录
做过452. 用最少数量的箭引爆气球之后这三个题目就感觉挺简单的!
435. 无重叠区间
题目链接:435. 无重叠区间
题目描述:给定一个区间的集合
intervals
,其中intervals[i] = [starti, endi]
。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
int cmp(const void* e1,const void* e2){
int* p1=*(int**)e1;
int* p2=*(int**)e2;
return p1[0]==p2[0]?p1[1]-p2[1]:p1[0]-p2[0];
}
int eraseOverlapIntervals(int** intervals, int intervalsSize, int* intervalsColSize){
qsort(intervals,intervalsSize,sizeof(intervals[0]),cmp);
int ret=0;
int temp=intervals[0][1];
for(int i=1;i<intervalsSize;i++){
if(intervals[i][0]<temp){
ret++;
temp=fmin(intervals[i][1],temp);
}else{
temp=intervals[i][1];
}
}
return ret;
}
763.划分字母区间
题目链接:763. 划分字母区间
题目描述:
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。
返回一个表示每个字符串片段的长度的列表。
用数组模拟hash来存储元素最后一次出现的下标!
int* partitionLabels(char * s, int* returnSize){
int box[26]={0};
int* ret=(int*)malloc(sizeof(int)*500);
*returnSize=0;
//box中记录元素出现的最远下标
for(int i=0;i<strlen(s);i++){
box[s[i]-'a']=i;
}
int begin=0;
int end=0;
for(int i=0;i<strlen(s);i++){
end=fmax(end,box[s[i]-'a']);
if(end==i){
ret[(*returnSize)++]=end-begin+1;
begin=end+1;
}
}
return ret;
}
56. 合并区间
题目链接:56. 合并区间
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
int cmp(const void* e1,const void* e2){
int* p1=*(int**)e1;
int* p2=*(int**)e2;
//按起始坐标升序排序
return p1[0]-p2[0];
}
int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes){
qsort(intervals,intervalsSize,sizeof(intervals[0]),cmp);
int** ret=(int**)malloc(sizeof(int*)*intervalsSize);
*returnColumnSizes=(int*)malloc(sizeof(int)*intervalsSize);
*returnSize=0;
for(int i=0;i<intervalsSize;i++){
(*returnColumnSizes)[(*returnSize)]=2;
ret[(*returnSize)]=malloc(sizeof(int)*2);
//intervals[i][0]为起始坐标
ret[*returnSize][0]=intervals[i][0];
int end=intervals[i][1];
while((i+1)<intervalsSize&&intervals[i+1][0]<=end){
//如果有重叠,不断更新终止坐标
end=fmax(end,intervals[++i][1]);
}
//填充终止坐标
ret[(*returnSize)++][1]=end;
}
return ret;
}