线性时间求出能够覆盖的最多区间数目

/**
* 区间覆盖问题: 要求给定一组已经排好序数字,每个数字代表一个以其为起点的单位区间。
* 然后给定一个区间长度L, 要求能够覆盖到最多的单位区间,并且整个长度不超过L。
* 同时给出覆盖了哪些区间。比如L=5,{1,2,7,10,11,12,14,20,22,23},
* 能够覆盖最多10,11,12,14四个区间,覆盖长度长度为5 <= L。
*/

#include <stdio.h>
#define M 10	//单位区间数目
#define L 5		//区间长度
int a[M] = {1,2,7,10,11,12,14,20,22,23}; //排好序的数字(单位区间)

/**
* 返回最大能够括住的区间数目,要求括住的长度不超过L
*/
int find_maxLeval(){
	int begin,end;
	int gap_num,gap_v;
	int max_leval_num = 0;
	int l,r;

	//使用两个指针,分别指向括住的区间的首尾
	begin = end = 0;
	while(end < M){
		gap_num = end - begin + 1;		//括住的区间数目
		gap_v = a[end] - a[begin] + 1;	//括住的区间长度
		if(gap_v > L){	//如果长度超过了L,则向前移动begin指针
			while(gap_v > L){
				begin++;
				gap_num = end - begin + 1;				
				gap_v = a[end] - a[begin] + 1;
			}
		}
		else{	//如果长度未超过L,则看是否需要更新括住的区间数目
			if(gap_num > max_leval_num){
				max_leval_num = gap_num;	//更新括住的区间数目
				l = begin;					//更新首指针
				r = end;					//更新尾指针
			}
		}
		end++;
	}
	printf("l=%d,r=%d\n",l,r);
	return max_leval_num;
}

int main(){
	int max;
	max = find_maxLeval();
	printf("max=%d\n",max);

	return 0;
}

运行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值