演算法知識梳理 5 陣列第二部分

2021-09-11 11:34:46 字數 3880 閱讀 1646

即尋找一列數中最小的k個數

利用最大堆的特點,加入我們對乙個長度為n的陣列p的前k個元素進行建堆操作,那麼p[0]p[0,..,k-1]的最大值,之後再對p[k,..,n-1]依次遍歷:

直到i遍歷到n-1為止,此時p[0,..,k-1]就是陣列p最小的k個元素。

class

untitled

p[di] = t;

} static

void

buildmaxheap

(int p, int length) }

static

void

minkthnum

(int p ,int k, int length)}}

public

static

void

main

(string args)

; minkthnum(p, 3, p.length);

for (int i=0; i < 3; i++) }}

複製**

>> 2

>> 1

>> -5

複製**

陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5+2-1+2=8

通過對陣列中的元素進行線性的遍歷,並對每個元素進行累加,當發現目前為止累加的和maxendinghere小於0時,則說明最大的連續子陣列不可能包含目前遍歷到的子陣列,那麼就從下乙個元素tmaxbegin開始計算子陣列。

在遍歷的過程中更新目前位置獲得的最大連續子陣列的和maxsofar,以及起止位置maxbeginmaxend

class

untitled

//更新目前為止計算到的最大值。

if(maxsofar < maxendinghere)

} //考慮陣列全部是負數的情況

if(maxsofar == 0)

}} for (int i = maxbegin; i <= maxend; i++)

} public

static

void

main

(string args)

; maxsumsubarray(p, p.length); }}

複製**

> i=5

> i=2

> i=-1

> i=2

複製**

這個問題其實是2.2的變種,這時候輸入是乙個二維的矩陣,需要找到乙個子矩陣,該子矩陣的和是這個二維的所有子矩陣中最大的。

二維的問題和2.2中的一維問題的核心解決思路相同。

對於二維情況,我們將同一列的多個元素合併成乙個元素來實現降維的效果,為了能實現在o(1)的時間內計算出同一列的多行元素之和,需要構建乙個輔助陣列,該輔助陣列ps[i][j]的值,等於原輸入陣列pp[0][0]為左上角到p[i][j]為右下角構成的子矩陣的所有元素之和,通過該輔助陣列就能在o(1)的時間內計算出lrowhrow行之間第col列的所有元素之和,計算公式為:

ps[hrow][col] - ps[hrow][col-1] - ps[lrow-1][col] + ps[lrow-1][col-1]

複製**

class

untitled

static

void

maxsumsubarray2

(int p, int xlen, int ylen)

}//求矩陣中的最大和,將位於同乙個列的多行元素合併成乙個元素,因此需要遍歷包含不同行的情況。

for (int pstartrow = 1; pstartrow < psxlen; pstartrow++)

if (maxsofar < maxendinghere)

}maxendinghere = 0;

tcolbegin = 1;}}

system.out.println("最大和=" + maxsofar + ",起始行=" + sx + ",終止行=" + ex + ",起始列=" + sy + ",終止列=" + ey);

}public

static

void

main

(string args)

, , };

maxsumsubarray2(p, 3, 3);

}}複製**

>> 最大和=39,起始行=1,終止行=2,起始列=0,終止列=2

複製**

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

這裡採用的是歸併演算法的思想,歸併演算法包含三個關鍵步驟:

對於上面的例子,我們將整個陣列分解為a、b兩部分,則整個陣列的逆序對個數就等於:

a部分組成的陣列的逆序對 + b部分組成的陣列的逆序對 + a與b之間的逆序對

複製**

這裡有乙個關鍵的點,就是需要保證在計算ab之間的逆序對時,ab內的元素都是有序的。

class

untitled

if (endindex-startindex == 1) else

} int midoffset = (endindex-startindex) >> 1;

int l = inversepairs(p, startindex, startindex+midoffset);

int r = inversepairs(p, startindex+midoffset+1, endindex);

return l + r + inversecore(p, startindex, midoffset, endindex); }

static

intinversecore

(int p, int startindex, int midoffset, int endindex)

else

} return c;

} public

static

void

main

(string args)

; system.out.println("inverse count=" + inversepairs(p, 0, 3)); }}

複製**

>> inverse count=5

複製**

php array陣列(第二部分)

array fill 用給定的鍵值填充陣列引數 index 必須。規定返回陣列的起始索引。引數 number 必須。規定填充的元素的數量,其值必須大於0。引數 value 必須。規定用於填充陣列的鍵值。a1 array fill 3,4,blue b1 array fill 0,1,red prin...

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...