1. 程式人生 > >演算法練習:最大下標距離

演算法練習:最大下標距離

一、題目描述

給定一個整型陣列,找出最大下標距離j-i,當且僅當a[j]>a[i]i < j

二、直觀方案( 時間複雜度為O(n^2) 

對每個元素,從其後找出比其大的元素,並計算下標距離,取距離中的最大值即可。該

方案的時間複雜度為O(n^2)。那麼能不能優化下呢?

三、優化方案( 時間複雜度為O(n) 

存在這樣一個事實,當a[i+1]大於a[i]時,如果在它們的後面存在一個大於它們的元素a[k]k > i+1>i 那麼我們就不需要考慮a[i+1],因為明顯的k-i > k-(i+1)。舉個例子,陣列{34, 1, 27 },因為3>4

,所以元素73的下標距離大於74的。

基於以上的事實,我們只要從陣列的第一個元素開始,找一個下降的序列,從尾部開始掃描,求出最大下標距離。

例如,陣列{5, 3, 4, 0, 1, 4, 1},首先找到下降序列{5, 3, 0 },然後依據以下步驟找出答案:

第一步,i = 3j = 6a[3] = 0 < a[6] = 1nMaxSubDistance = 3

第二步,i = 1j = 6a[1] = 3 > a[6] = 1

第三步,i = 1j = 5a[1] = 3 < a[5] = 4nMaxSubDistance = 3

第四步,i = 0j = 5

a[0] = 5 > a[5] = 4

第五步,i = 0j = 4a[0] = 5 > a[4] = 1

第六步,i = 0j = 3a[0] = 5 > a[3] = 0

第七步,i = 0j = 2a[0] = 5 > a[2] = 4

第八步,i = 0j = 1a[0] = 5 > a[1] = 3

第九步,i = -1,結束;

注意,每次找到一個最大值後,j不需要重置,繼續從原來j的位置掃描下去,如果每次j都重置,那演算法複雜度就回到O(n^2)了。

程式碼實現如下:

//返回陣列中最大下標距離j-i,當且僅當nArray[i]<nArray[j],j>i
int MaxSubDistance( int nArray[], int nCount )
{
	//查詢一個下降序列
	bool* bDescSeq = new bool[nCount];
	memset( bDescSeq, 0, sizeof(bool)*nCount );
	int nMinNum = nArray[0];
	for ( int i = 1; i < nCount; ++i )
	{
		if ( nArray[i] < nMinNum )
		{
			bDescSeq[i] = true;
			nMinNum = nArray[i];
		}
	}


	int nMaxSubDistance = 0;
	int i = nCount - 1;
	int j = nCount - 1;
	while( i >= 0 )
	{
		if( !bDescSeq[i] )
		{
			--i;
			continue;
		}

		while( j > i && nArray[i] >= nArray[j] )
			--j;

		if ( (j - i) > nMaxSubDistance )
		{
			nMaxSubDistance = j - i;
			//j = nCount - 1;//這句多餘,這句加上的話,時間複雜度則為O(n^2)了。
		}

		--i;
	}


	if ( NULL != bDescSeq )
	{
		delete[] bDescSeq;
		bDescSeq = NULL;
	}

	return nMaxSubDistance;
}


系列文章說明:
1.本系列文章[演算法練習],僅僅是本人學習過程的一個記錄以及自我激勵,沒有什麼說教的意思。如果能給讀者帶來些許知識及感悟,那是我的榮幸。
2.本系列文章是本人學習陳東鋒老師《進軍矽谷,程式設計師面試揭祕》一書而寫的一些心得體會,文章大多數觀點均來自此書,特此說明!
3.文章之中,難免有諸多的錯誤與不足,歡迎讀者批評指正,謝謝.

作者:山丘兒
轉載請標明出處,謝謝。原文地址:http://blog.csdn.net/s634772208/article/details/46462775

相關推薦

演算法練習距離

一、題目描述 給定一個整型陣列,找出最大下標距離j-i,當且僅當a[j]>a[i],i < j。 二、直觀方案( 時間複雜度為O(n^2) ) 對每個元素,從其後找出比其大的元素,並計算下標距離,取距離中的最大值即可。該 方案的時間複雜度為O(n^2)。那麼能

面試陣列距離

給定一個整形陣列,找出最大下標距離j−i, 當且A[i]<A[j]和i<j 複雜度:三次掃描,每次的複雜度O(N) 演算法:{5,3,4,0,1,4,1} 找出從第一個元素開始的下降序列

演算法優化欄位和,雙指標遍歷(n^2),分治法(nlogn),動態規劃(n)

最大欄位和,有點類似與最長公共子序列,這裡是求連續一段求和最大的一段,比如[-2,11,-4,-4,13,-5,-2]最大求和的連續一段為11,-4,-4,13,和為16. 最基本的雙針模型遍歷,兩個指標,分別代表最大和序列的起始和終止,演算法時間複雜度O(n^2) # 以下演算法時

演算法優化m個子段和,問題規模從1個子段和擴充套件到m個,動態規劃

最大m個子段和,問題規模從1個子段和擴充套件到m個,動態規劃 問題規模由2個決定,一是子段數m,二是元素個數n,準確的說是最後一個子段終止的標號 b(i,j)定義為:前j個元素中有i個子段,且第i個子段包含j,i個子段和為b(i,j) 那麼原問題的最優解為max{b(m,j)},m&

機器學習演算法似然估計證明小二乘法合理性

最小二乘法的核心思想是保證所有資料誤差的平方和最小,但我們是否認真思考過為什麼資料誤差平方和最小便會最優,本文便從最大似然估計演算法的角度來推導最小二乘法的思想合理性,下面我們先了解一下最大似然估計和最小二乘法,最後我們通過中心極限定理剋制的誤差ε服從正態分佈

演算法愛好者——演算法間距 ? 待解決

給定一個未經排序的陣列,寫一個函式找出其排序表中連續兩個要素的最大間距。如果陣列中的要素少於 2 個,請返回 0。 注意事項: 1、可以假定陣列中的所有要素都是非負整數,且最大不超過 32 位整數。

用二分法查找出滿足條件值的(滿足條件的值有多個)

先理清思路:如果查詢的值,有多個相同的時候,首先用二分法查出其中的一個,並將此值的索引值賦給一個臨時變數(temp),然後在將查出來的數的索引值加一,繼續向右查詢下一個值的索引值,如果索引值存在的話,則再將查詢出來的值,賦給temp,一直迴圈,直至最後,將tem

演算法愛好者——演算法點集 ? 待解決

P為給定的二維平面整數點集。定義 P 中某點x,如果x滿足 P 中任意點都不在 x 的右上方區域內(橫縱座標都大於x),則稱其為“最大的”。求出所有“最大的”點的集合。(所有點的橫座標和縱座標都不重複, 座標軸範圍在[ 0, 1e9 ) 內) 如下圖:實心點為

PTA 練習7-2 求值及其(20 分)

本題要求編寫程式,找出給定的n個數中的最大值及其對應的最小下標(下標從0開始)。 輸入格式: 輸入在第一行中給出一個正整數n(1<n≤10)。第二行輸入n個整數,用空格分開。 輸出格式: 在一行中輸出最大值及最大值的最小下標,中間用一個空格分開。 輸入樣例

演算法設計演算法以找到利潤。您可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)

假設您有一個數組,其中第i個元素是第i天給定股票的價格。 設計演算法以找到最大利潤。您可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)。 注意:您不能同時進行多筆交易(即,您必須在再次購買之前賣出股票)。 例1: 輸入: [7,1,5,3,6,4] 輸出: 7 說明:在第2天

ml課程熵與EM演算法及應用(含程式碼實現)

以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。 本文主要介紹最大熵模型與EM演算法相關內容及相關程式碼案例。 關於熵之前的文章中已經學習過,具體可以檢視:ml課程:決策樹、隨機森林、GBDT、XGBoost相關(含程式碼實現),補充一些 基本概念: 資訊量:資訊的度量,即

智慧演算法中終止條件評估次數” or “迭代次數”

使用 最大迭代次數依據:                智慧演算法既然是通過迭代,yi一步步的趨向zui'最優解,那就應該在同樣的dai'代數下jin'進行對比 使用 評估次數依據:                一般  種群大小*迭代次數=評價次數。當種群大小一樣時,

分治法關於選擇演算法,找,找小,同時找小,找第二大

找最大或者最小,蠻力演算法為最優的演算法,需要比較n-1次 # 這個已經是最優的演算法了,比較n-1次 def findMax(arr): max_pivot = arr[0] for i in range(1,len(arr)): if arr

前端演算法設計演算法以找到利潤。您可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)

假設您有一個數組,其中第i個元素是第i天給定股票的價格。 設計演算法以找到最大利潤。您可以根據需要完成儘可能多的交易(即,多次買入並賣出一股股票)。 注意:您不能同時進行多筆交易(即,您必須在再次購買之前賣出股票)。 例1: 輸入: [7,1,5,3,6,4]

演算法設計例題團(回溯、分枝限界)

Description 給定無向圖G=(V,E)。如果UV,且對任意u, v ∈ U 有 (u,v) ∈ E,則稱U是G的完全子圖。G的完全子圖U是G的團,當且僅當U不包含在G的更大的完全子圖中。G的最大團是指G中所含頂點數最多的團。 Input

演算法9-1流和小切割問題

最小切割問題 首先介紹什麼是切割。切割就是將一張圖中的頂點分成兩部分A和B。 接下來介紹一下什麼是容量。容量是A區到B區所有的邊權重之和。 最小切割就是求一張圖中使得容量最小的切割方式。 最小切割的應用 最小切割在國家的拆分時會用到。著名的蘇聯解體事件就是

OpenCV程式設計熵閾值分割演算法實現(程式碼可執行)

        將資訊理論中的 shannon 熵概念用於影象分割, 其依據是使得影象中目標與背景分佈的資訊量最大,即通過測量影象灰度直方圖的熵,找出最佳閾值。根據 shannon 熵的概念,對於灰度範圍為 0,1,2,…,L-1 的影象,其直方圖的熵定義為(僅僅是定義)

Java練習--陣列距離

Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers from t

整數及其

循環 輸入 還要 width clas 輸入格式 截圖 brush card 7-2 求最大值及其下標 (20 分) 本題要求編寫程序,找出給定的n個數中的最大值及其對應的最小下標(下標從0開始)。 輸入格式: 輸入在第一行中給出一個正整數n(1<n

BZOJ 3943 [Usaco2015 Feb]SuperBull生成樹

sort -1 iostream php ref log ring nbsp 題目 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=3943 題意:   有n只隊伍,每個隊伍有一個編號a[i]。   每場比賽有兩支隊