常見演算法思路總結

2021-06-20 23:40:09 字數 1447 閱讀 7293

1.刪除單鏈表p指向的那個元素

有三個思路:

(1)前頭結點開始查詢,得到其前驅結點,然後刪除,此時時間複雜度為o(n);

(2)利用雙向鍊錶,此時時間複雜度為o(1);

(3)當該結點不是鍊錶尾部元素時,將它後面的結點值儲存起來(賦給p),刪除其結點;當該結點是最後乙個元素時,

從頭結點遍歷,此時時間複雜度為o(n),平均時間複雜度為o(1);此方法最好

2.找出兩個鍊錶的公共結點

第一種方法蠻力法:在第一鍊錶上順序遍歷每個結點。每遍歷乙個結點的時候,在第二個鍊錶上順

序遍歷每個結點,如果此時兩個鍊錶上的結點是一樣的,說明此時兩個鍊錶重合,於是找到了它們的

公共結點。如果第乙個鍊錶的長度為m,第二個鍊錶的長度為n,該方法時間複雜度為o(mn);

第二種方法:分別遍歷兩個鍊錶得到它們的長度,並求出兩個長度之差。在長的鍊錶上遍歷若干次之

後,再同步遍歷兩個鍊錶,直到找到相同的結點,或者一直到鍊錶結束。此時,如果第乙個鍊錶的長

度為m,第二個鍊錶的長度為n,該方法的時間複雜度為o(m+n).

3.如何在乙個字串中查詢乙個字元?

(1).最簡單的方法就是從頭到尾掃瞄整個字串,時間複雜度為o(n)

(2).由於字元的總數是有限的,對於八位的char型字元而言,總共只有256個字元,我們可以新建乙個大小為

256的陣列,把所有元素都初始化為0.然後對字串中每乙個字元,把它的ascii碼對映成索引,把陣列中該

索引對應的元素設為1.這時候,要查詢乙個字元就變得很快了:根據這個字元的ascii碼,在陣列中對應的下

標找到該元素,如果為0,表示字串中沒有該字元,否則包含該字元。此時,查詢乙個字元的時間複雜度

是o(1).其實這個陣列就是乙個hash表。

4、合併兩個有序的單向鍊錶

首先要考慮兩個鍊錶是否有交叉兩種情況。具體思路如下:設排序規則為g(x1,x2),同步遍歷兩個鍊錶的游標指標p1,p2,插入游標p

1)初始化p1為鍊錶1的頭指標,p2為鍊錶2的頭指標,p=null;

2)如果p1==p2,則兩個鍊錶存在公共點,p1後的所有節點相同,將p1後的所有節點鏈在p後,結束

3)如果p1或p2有乙個為null,將非空的那個指標後的所有元素鏈在p後,結束;

4)如果滿足g(p1,p2)則將p1插入p後,p和p1後移,否則將p2插入p後,p和p2後移,繼續步驟2

5.請編寫乙個高效率的函式來找出字串中的第乙個無重複字元。例如,「total」中第乙個無重複字元是「o」,「teeter」中的第乙個無重複字元則是「r」。

並對演算法的執行效率做出評估。

思路:利用雜湊表來實現。第一步,建立字元出現次數統計雜湊表;針對字串中的每乙個字元,如果雜湊表中沒有與該字元對應的統計數字,存入「1」,否則,遞加與它對應的統計數字。第二步,對字串進行掃瞄,針對字串中的每乙個字元,如果雜湊表中的統計數字為「1」,返回該字元,如果沒有統計數字為「1」的字元,返回「null」

排序演算法思路總結

好久不學演算法了,好多東西都忘了,所以回來整理一下原來學過的東西,這裡排序都預設以公升序為例 先說3個簡單的,時間複雜度為o n 2 1.氣泡排序 將相鄰兩個數進行比較,如果後者較小,則交換,這樣每次結束後,都能將第i大的數放到正確的位置 2.選擇排序 第一次在0 n 1的範圍內尋找最小值,將其放到...

常見排序演算法及其演算法思路解讀

幾種常見的排序演算法及其演算法思路 1.選擇排序 o n方 所謂選擇就是每次都選擇乙個最小的元素放在最前面。思路是去尋找最小元素的座標,然後將最小座標的元素與當前座標的元素交換。具體的做法是假設當前迴圈的第乙個座標是最小元素的座標,然後從第二個元素開始遍歷 內層迴圈 如果該元素比最小座標的的元素小,...

動態規劃常見思路分享總結

那幾乎可以肯定,考察的是動態規劃技巧,時間複雜度一般都是 o n 2 int n array.length int dp newint n for int i 1 i n i 符合歸納法,可以找到狀態轉移的關係。int n arr.length int dp newdp n n for int i ...