演算法練習 重疊區間個數

2021-08-14 22:16:01 字數 1911 閱讀 3928

一、題目描述

給定多個可能重疊的區間,找出重疊區間的個數。

舉例如下:

輸入:[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 記錄前期的最小結束時間...