快速處理區間合併問題的一個優秀思路(效率取決於區間可取範圍)

這算不上算法,只是一個我認爲優秀的思路:

#include <stdio.h>
const int maxm=1000000;
int vis[maxm];
int main(){
	int n;
	scanf("%d",&n);
	int l,r;
	for(int i=0;i<maxm;i++) vis[i]=0;
	for(int i=0;i<n;i++){
		scanf("%d %d",&l,&r);//區間[l,r]
		vis[l]++;
		vis[r+1]--;
	}
	for(int i=1;i<maxm;i++) vis[i]+=vis[i-1];
	//此時的vis[i]>0則表示i被某一段區間所覆蓋,
	for(int i=0;i<10;i++) printf("%d",vis[i]>0?1:0); 
	return 0;
}

    如上面的代碼,以前當我們處理區間合併問題的時候往往是通過排序然後處理判斷起點與終點進而完成區間的合併,複雜度爲n*logn+n,且代碼挺多的,而如果我們的問題只是想知道某些個點是否在任意一個區間內,或單純的合併區間,我們可以用上面這種複雜度爲區間可取範圍maxm的算法迅速得到結果.簡潔高效.

    最終vis中連續的正數即爲最後合併的區間,

    而核心思維也很明顯,點i前面的起點比終點多那自然它在某個區間上.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章