基本資料結構與演算法 之陣列

2021-06-18 18:45:40 字數 1716 閱讀 5129

1. mxn的矩陣,若某個元素值為0,則將其所在的行和列全置為0。

定義行陣列rows,列陣列cols。如果a[i][j]為0,則將rows[i]和cols[j]置為true。

當遍歷完整個a陣列後,根據rows和cols的值對矩陣進行修改。

2. 陣列a,將a[0]...a[p]和a[p+1]...a[n-1]這兩段交換位置。只允許使用o(1)的額外空間。

將陣列這兩段分別逆序。然後將整個陣列逆序。

3. 找陣列中最大的或最小的數。

順序比較,時間代價是n-1。

4. 同時找陣列中最大的和最小的數。

先兩兩比較,得到n/2個較大數和n/2個較小數。在這兩個集合中分別順序的找到最大和最小數。

時間代價是n/2+n/2-1+n/2-1=3/2n-2

5. 找陣列中第二大的數。

錦標賽找出最大數。然後從被最大數打敗的數中順序找到第二大的數。

時間代價是n-1+logn-1 = n+logn-2

6. 找陣列中第k大的數。

所有元素五五一組,共有n/5組。每組計算中位數。然後取所有組的中位數中的中位數m,。用m將陣列分成兩組,一組的值都小於m,另一組的值都大於m。

如果第一組的元素個數大於等於k,則遞迴的在第一組中找第k大的數。

如果第一組的元素個數小於k-1,則遞迴的在第二組中找第(k-第一組的元素個數+1)大的數。

如果第一組的元素個數等於k-1,則返回m。

目標:確定乙個軸值,將陣列分成兩部分,一部分小於軸值,一部分大於軸值。根據兩部分的元素個數,決定在哪部分中遞迴的查詢。

7. 扔玻璃瓶,測強度。若有2個玻璃瓶,n個高度,以什麼策略扔?

1) n^1/2個高度一組,共n^1/2組。第乙個瓶子,由低到高從每組的最高處往下扔,確定組號。第二個瓶子,從該組內由低到高往下扔,確定組內位置。時間複雜度o(n^1/2)。

2) n個高度分組,越高的組,組內的高度個數越少。這樣可以保證不論瓶子的強度是多少,平均的扔瓶子次數相同。

假設分為k組,最低組的組內高度個數為k,次低組的組內高度個數為k-1,...,最高組的組內高度個數為1。k+(k-1)+...+1=n,求k即可。

8. 最長公共子串行。

子串行:在原陣列中不連續的保持相對次序不變的元素序列。

動態規劃:f[i, j]表示a[0]...a[i]和b[0]...b[j]這兩個序列的最長公共子串行的長度。

如果a[i]=b[j],則f[i,j] = f[i-1, j-1]+1;否則,f[i,j]=max。

最後取f[n-1][m-1]。

9. 最長公共子串

子串:在原陣列中連續的元素序列。

動態規劃:f[i,j]表示以a[i]和b[j]結尾的最長公共子串的長度,a[i]和b[j]要做公共子串的結尾元素。

如果a[i]=b[j],則f[i,j] = f[i-1,j-1]+1;否則,f[i,j]=0。

最後取f[i,j]中的最大值。

10. 最大子段和

動態規劃:f[i]表示以a[i]為結尾的最大子段和。

f[i] = max

f[0] = max

最後取f[i]中的最大值。

基本資料結構與演算法 之鍊錶

1.單鏈表逆序 三個指標,第乙個表示當前結點前面的結點,第二個表示當前結點,第三個表示當前結點後面的結點。將第二個結點的next指標指向第乙個結點。第乙個結點後移,第二個結點後移,第三個結點後移。listnode reverselist listnode head head next null he...

演算法 基本資料結構

1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...

資料結構與演算法分析記錄 基本資料結構

單鏈表 struct node 找到某一元素 position find elementtype x,list list 刪除某一元素 void delete elementtype x,list l 找到目標元素前的元素 position findprevious elementtype x,li...