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...