即尋找一列數中最小的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
,以及起止位置maxbegin
和maxend
。
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]
的值,等於原輸入陣列p
以p[0][0]
為左上角到p[i][j]
為右下角構成的子矩陣的所有元素之和,通過該輔助陣列就能在o(1)
的時間內計算出lrow
到hrow
行之間第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之間的逆序對
複製**
這裡有乙個關鍵的點,就是需要保證在計算a
與b
之間的逆序對時,a
和b
內的元素都是有序的。
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 函式有兩個引數,引數...