演算法練習:重疊區間個數
一、題目描述
給定多個可能重疊的區間,找出重疊區間的個數。
舉例如下:
輸入:[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止點),然後對這些點排序,最後,從頭開始掃描排序的結果,遇到起點重疊個數加
本演算法的時間複雜度為O(nlogn),因為演算法時間主要消耗在排序上。
三、演算法實現
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <Windows.h> using namespace std; //區間定義 class Interval { public: Interval( int iStart, int iEnd) :m_iStart( iStart), m_iEnd(iEnd){} int m_iStart; int m_iEnd; }; typedef vector<Interval> IntervalVec; //區間拆分的點定義 class PointComparable { public: PointComparable( int iVal, int iType ) :m_iVal( iVal ), m_iType( iType ){} //過載小於操作符,排序使用 bool operator < ( const PointComparable& pcPoint ) { if ( this->m_iVal == pcPoint.m_iVal ) { return this->m_iType < pcPoint.m_iType; } return this->m_iVal < pcPoint.m_iVal; } int m_iVal; int m_iType;//點型別,0為起點,1為終點 }; int GetOverlappedIntervalMaxCount( const IntervalVec& intvVec ) { vector<PointComparable> pcVec; for ( IntervalVec::const_iterator it = intvVec.begin(); it != intvVec.end(); ++it ) { pcVec.push_back( PointComparable( it->m_iStart, 0 ) ); pcVec.push_back( PointComparable( it->m_iEnd, 1 ) ); } sort( pcVec.begin(), pcVec.end() ); int iMaxCount = 0; int iCurCount = 0; for ( vector<PointComparable>::iterator itTemp = pcVec.begin(); itTemp != pcVec.end(); ++itTemp ) { cout << itTemp->m_iVal << " " << itTemp->m_iType << endl; if ( itTemp->m_iType == 0 ) { iCurCount++; iMaxCount = __max( iCurCount, iMaxCount ); } else { iCurCount--; } } return iMaxCount; } int main() { IntervalVec intvVec; // intvVec.push_back( Interval(1,5) ); // intvVec.push_back( Interval(5,10) ); // intvVec.push_back( Interval(1,7) ); // intvVec.push_back( Interval(2,5) ); // intvVec.push_back( Interval(3,6) ); // intvVec.push_back( Interval(8,15) ); // intvVec.push_back( Interval(9,17) ); // intvVec.push_back( Interval(20,25) ); intvVec.push_back( Interval(1,2) ); intvVec.push_back( Interval(2,3) ); intvVec.push_back( Interval(3,4) ); intvVec.push_back( Interval(4,5) ); cout << "最大重疊區間個數:" << GetOverlappedIntervalMaxCount( intvVec )
<span style="white-space:pre"> </span>cout << endl;
return 0;
}
系列文章說明:
1.本系列文章[演算法練習],僅僅是本人學習過程的一個記錄以及自我激勵,沒有什麼說教的意思。如果能給讀者帶來些許知識及感悟,那是我的榮幸。
2.本系列文章是本人學習陳東鋒老師《進軍矽谷,程式設計師面試揭祕》一書而寫的一些心得體會,文章大多數觀點均來自此書,特此說明!
3.文章之中,難免有諸多的錯誤與不足,歡迎讀者批評指正,謝謝.
作者:山丘兒
轉載請標明出處,謝謝。原文地址:http://blog.csdn.net/s634772208/article/details/46492651
相關推薦
演算法練習:重疊區間個數
一、題目描述 給定多個可能重疊的區間,找出重疊區間的個數。 舉例如下: 輸入:[1,5],[10,15],[5,10],[20,30] 輸出:2 說明:題意應該是找出重疊區間中區間的最大個數,當沒有區間重疊時,重疊個數最大為1,比如 輸入為:[1,5],[10,15],則
02027_線程池練習:返回兩個數相加的結果
turn mage 操作 ima execution task ati 實現類 res 1、要求:通過線程池中的線程對象,使用Callable接口完成兩個數求和操作。 2、代碼實現: (1)Callable接口實現類 1 import java.util.concu
演算法練習:一維陣列旋轉
題目描述:求一個一維陣列向右旋轉K個位置後的結果。比如,一維陣列{1, 2, 3, 4, 5},當k = 2時,求得的結果為{4, 5, 1, 2, 3}。要求常數級空間複雜度,允許修改原有陣列。 一、使用額外的空間(在不要求常數級空間複雜度的情況下) 這樣很簡單,使用一
演算法練習:兩指標之有序陣列去重
問題描述 給出一個有序陣列,就地移除重複元素,保持每個元素只出現一次,並返回新陣列的長度。 問題分析 這個比較簡單,直接使用兩個指標,一個在前,一個在後,掃描一遍陣列即可。時間複雜度為O(n^2)。
演算法設計:有n個數,範圍是從1到n,且只有唯一的兩個數相同,如何最快的求相同的這個數值?
為了方便問題描述,假設n = 10,即陣列a[10]裡有10個數,範圍是從1到10,且裡面只有兩個數的值是相同的。如何求這個相同的數值。 常規思路: 1,先氣泡排序,然後用while迴圈找出這個相同的數值 2,直接用冒泡的思路,i從0到n-2,j = i+1,依次比,找出相
演算法練習:最大下標距離
一、題目描述 給定一個整型陣列,找出最大下標距離j-i,當且僅當a[j]>a[i],i < j。 二、直觀方案( 時間複雜度為O(n^2) ) 對每個元素,從其後找出比其大的元素,並計算下標距離,取距離中的最大值即可。該 方案的時間複雜度為O(n^2)。那麼能
程式設計師進階之演算法練習:LeetCode專場
歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 本文由落影發表 前言 LeetCode上的題目是大公司面試常見的演算法題,今天的目標是拿下5道演算法題: 題目1是基於連結串列的大數加法,既考察基本資料結構的瞭解,又考察在處理加法過程中的邊界處理; 題目2是求陣列出現頻率前k大的數字,考察思維能
演算法1:計算長方形個數
package suanfa; /** * 計算長方形個數 * 給:寬w,高h * 求:寬和高組成的網路,總的長方形個數 */ public class t1 { public static void main(String[] args) { long
演算法練習:兩數之和
題目:給定一個整型陣列,是否能找出兩個數使其和為指定的某個值?注:整型陣列中不存在相同的數。 一、解題方法 1、暴力破解法(時間複雜度O(n^2) ) 這是最容易想到的一種方法,即使用兩層迴圈,從數組裡取出一個數,然後在此數之後部分找出另外一個數,計算兩數之和,判斷是否等於
演算法設計:將一個數組分為奇數、偶數左右兩個部分,要求時間複雜度為O(n)
已知陣列A[n]中的元素為整型,設計演算法將其調整為左右兩部分,左邊所有元素為奇數,右邊所有元素為偶數,並要求演算法的時間複雜度為O(n)。 程式碼實現部分: #include &l
演算法練習:產生指定範圍的隨機數
一、問題描述 給出一個整型陣列,以及一個區間範圍[min,max],寫一個函式產生一個在此區間範圍內的隨機數,並且該隨機數不在數組裡,假設總能找到該隨機數。 二、分析與解答 分成兩步,即可解答。第一步,生成一個隨機數x包含於[min,max];第二步,判斷此隨機數是否在陣
演算法練習:Add Two Numbers
解題思路: (1)申請一個節點指標result,指向結果連結串列,另外申請一個節點指標,用於指向該連結串列。 (2)定義一個變數over,初始化為0。兩數之和大於等於10時, over賦值為1。 (3)遍歷l1和l2,p指向l1,q指向l2: a. 當兩者均不為空的時候,兩數相加,並判斷和是否大於等
演算法題:求N!末尾0的個數和求二進位制數中1的個數
1、給定一個整數,那麼N的階乘N!末尾有多少個0呢? 解題思路:N!=K*10^M,M的值即為N!末尾0的個數。又10^M=(2^M)*(5^M),因為一個數進行質因數分解後,2出現的概率比5大得多。所以只有計算出1到N包含多少個5的因子 public class demo2 {
演算法題 90:從多個數組中找最大值(百度筆試題
題目:有n個長度均為m的整型陣列,陣列中的元素都是從小到大有序排列,從所有這些陣列m*n個數中,找出值最大的前k個。請給出思路和時間複雜度。 類似賽馬問題做法 本Markdown編輯器使用StackEdit修改而來,用它寫部落格,將會帶來全新的體驗哦: Markdown和擴
JAVA演算法習題集合—第一階段3:基礎演算法練習之水仙花數判斷
知識點:資料型別轉換、while迴圈語句、for迴圈、陣列的使用。 1.整數位數判斷 輸入一個整數,輸出這個整數是幾位數。 執行結果: 輸入:56424 輸出:5 Scanner input=new Scanner(System.in); System.out.p
JAVA演算法習題集合—第一階段2:基礎演算法練習之for迴圈的練習
知識點:for迴圈、for迴圈和if語句的巢狀使用 8、輸出1到100 描述:輸出從1到100 執行結果: 1 2 3 4...100 for(int i=1;i<=100;i++){ Syste
JAVA演算法習題集合—第一階段1:基礎演算法練習
知識點:算術運算子、if語句、if-else語句、三元運算子的使用 1、兩個整數的和 描述:輸入整數a和b,輸出它們的和。 執行結果: 輸入a:100 輸入b:200 a+b=300 public static
演算法練習05 判斷兩個矩形是否重疊
題目(2018-11-20) 用一個物件的資料來表示一個矩形的位置和大小: { x: 100, y: 100, width: 150, height: 250 } 它表示一個寬為150高為250的矩形在頁面上的(100, 100)的位置。 請你完成一個函
實訓09.08:簡單的演算法練習
/*final 關鍵字 修飾的變數值 後期不可更改 相當於定義常量 常量 :不可更改 */ final int a = 10; //a = 20; 報錯的
演算法練習(1)動態規劃:買賣股票的最佳時機1
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個演算法來計算你所能獲取的最大利潤。 注意你不能在買入股票前賣出