一、題目描述
給定多個可能重疊的區間,找出重疊區間的個數。
舉例如下:
輸入:[1,5]
,[10
,15],[5
,10]
,[20
,30]
輸出:2
說明:題意應該是找出重疊區間中區間的最大個數,當沒有區間重疊時,重疊個數最大為1
,比如
輸入為:[1,5]
,[10
,15]
,則輸出為1;
輸入為:[1,2]
,[2,3]
,[3,4]
,[4,5]
,則輸出為
2(重疊區間相互之間都要有交集);
輸入為:[1,7]
,[2,5]
,[3,4]
,[8,15],[9
,17]
,[20
,25]
,則輸出為3。
二、題目分析
此題解題方法比較簡單,只要將區間分隔成各個點,每個點有兩個屬性,乙個是值,乙個是標誌(0
起點,1
止點),然後對這些點排序,最後,從頭開始掃瞄排序的結果,遇到起點重疊個數加
1,遇到止點重疊個數減
1,並且記錄好重疊個數的最大值。
本演算法的時間複雜度為o(nlogn)
,因為演算法時間主要消耗在排序上。
三、演算法實現
[cpp]view plain
copy
#include
#include
#include
#include
#include
using
namespace
std;
//區間定義
class
interval
intm_istart;
intm_iend;
};
typedef
vectorintervalvec;
//區間拆分的點定義
class
pointcomparable
//過載小於操作符,排序使用
bool
operator < (
const
pointcomparable& pcpoint )
return
this
->m_ival < pcpoint.m_ival;
} int
m_ival;
intm_itype;
//點型別,0為起點,1為終點
};
intconst
intervalvec& intvvec )
sort( pcvec.begin(), pcvec.end() );
intimaxcount = 0;
inticurcount = 0;
for( vector::iterator ittemp = pcvec.begin();
ittemp != pcvec.end(); ++ittemp )
else
} return
imaxcount;
} int
main()
系列文章說明:
1.本系列文章[演算法練習],僅僅是本人學習過程的乙個記錄以及自我激勵,沒有什麼說教的意思。如果能給讀者帶來些許知識及感悟,那是我的榮幸。
2.本系列文章是本人學習陳東鋒老師《進軍矽谷,程式設計師面試揭秘》一書而寫的一些心得體會,文章大多數觀點均來自此書,特此說明!
3.文章之中,難免有諸多的錯誤與不足,歡迎讀者批評指正,謝謝.
重疊區間的個數
題目 給定多個可能的重疊的區間,找出重疊區間的個數。區間的定義如下 class interval 首先,要定義區間的類,實現comparable介面,含有起點與止點的值和型別,還要重寫用於排序的compareto函式。class point implements comparable 還需要實現co...
區間重疊判斷演算法
在一次業務開發中,發現有一種資料,每天都會有乙個值,不論是否是節假日。由於這個值的變化頻率比較低,導致會有連續的n個日期,值是相同的。於是,就想將這些值合併。比如原來的結構是二元組data value date 合併成三元組data value begindate enddate 合併完原始資料後,...
刪除重疊的區間的個數
刪除重疊的區間的個數 package my import j a.util.arrays public class nooverlapintervals2 將所有區間按照起始時間排序 arrays.sort intervals v1,v2 v1 0 v2 0 用乙個變數end 記錄前期的最小結束時間...