1111111111111 算法彙總

如何找到兩個相交鏈表對交點?html

若是兩個單向鏈表有公共節點,則兩個鏈表會構成Y型結構,最後一個節點相同
咱們能夠從頭開始遍歷兩個鏈表,找到最後一個節點的指針,設爲p_a,p_b。同時記錄下兩個鏈表的長度len_a,len_b(假設len_a >= len_b)。
若是p_a == p_b,則說明兩個鏈表有公共節點,不然沒有。
若是有公共節點,則第一個公共節點距起始節點的距離知足 len_a - start_a == len_b - start_b。
因此第一個可能的公共節點距起始節點的距離是 len_a - len_b, 0。咱們從這兩個節點開始比較,直到找到第一個公共節點。數組

 

單向鏈表中,如何在給定節點前快速插入一個節點?

對於單向鏈表來講,在某個節點後面插入一個新節點是很是快的。
因此咱們能夠在給定節點後面插入一個新節點,而後交換給定節點和新節點的數據便可。緩存

 

找到鏈表的倒數第m個節點

方法1:
首先遍歷鏈表,統計鏈表的長度N。
而後再次遍歷鏈表,找到第N-m+1個節點,即爲倒數第m個節點。

方法2:
使用兩個指針,並使它們指向的節點相距m-1個。
而後同時向前移動兩個指針,當一個指針指最後一個節點時,第二個指針指向倒數第m個節點。spa


兩個方法的複雜度都是O(n)。
可是當N較大而m較小時,方法2可能會更快一些。由於方法2能更好利用CPU的緩存。

更多閱讀:
http://baike.baidu.com/view/2089.htm  CPU -> 緩存指針

 

找出數組中的衆數,衆數值出現次數大於數組長度一半的數?htm

1.逐個統計每一個數出現的次數,時間複雜度爲O(n*n)(n*(n-1)/2+n),n指數組元素的個數。blog

2.對數組進行排序,得出中間(n/2)元素就是衆數。證實用反證法,若是中間元素不是,則衆數出現的次數小於一半。排序能夠用計數排序O(n)達到最好,最後的結果也是最好。排序

3.上述排序的方法雖然時間複雜度是線性的,可是還有必定的計算量。試想,既然衆數是出現次數大於一半的數,那麼對數組每次刪除兩個不一樣元素(無論是否包含衆數)後獲得的子問題應該和原問題在本質上沒有改變。循環

 

Int數組,局部最大值?遍歷

 

2-sum問題,Int數組,找出全部兩個數相加爲N?

先排序,而後用兩個指針分別指向頭和尾,看是否符合條件,不斷向中間靠攏繼續找。

 

N-sum問題:

 

2-diff問題:Int數組,找出兩個數的差爲N的全部數?

先排序,用兩個指針,i從0開始向右移動,j從0開始向右移動,找到0位的數+N的值,有就找到一對,i向右移動一位,j繼續剛的位置向右移動匹配,若是沒有找到,i繼續移動,j繼續從當前位置向右匹配,知道j到數組結尾。

 

給一個數組,找出從1開始,第一個缺失的正整數?

1.暴力; 2.先快排 後遍歷數組找出  O(N*lgN)

3.由找出從1開始缺失的正整數,數組長度爲N,可知:第一個缺失的正整數確定介於1~N之間,極端狀況下1~N都有。那麼能夠申請一個同等長度的數組,先便利一遍原數組,當數組中出現1~N之間的數字時,將新數組的相應座標下的空間保存數字1,遍歷完只有,出現1~N的數字向對應在新數組的座標位置都設置成1了,因此再遍歷一遍新數組,找出第一個0的座標即爲所求。 時間和空間複雜度都是O(N)

4.循環不變式

    若是某命題爲初始爲真,且每次更改後仍然保持命題爲真,則若干次更改後該命題仍然爲真。

    經過循環不變式解這個題的思路:將找到的元素放到正確的位置上,若是最終發現某個元素一直沒有找到,則該元素即爲所求。 時間複雜度O(N),空間複雜度O(1)

 

查找旋轉數組的最小值

假定一個排序數組,以某個元素爲支點作了旋轉,如原數組0 1 2 4 5 6 7 旋轉後獲得4 5 6 7 0 1 2。

請找出一個旋轉數組的最小值?

經過二分法查找:找到數組中間位置的數組,與頭數字比較,若是頭數字小,說明前半截數據是正常的,懸轉的部分在後面,即最小值在後面,同理對後面的再作二分,知道找到最小值。

 

有一個天平,和12個硬幣,其中有一個假幣,假幣比真幣可能重也可能輕,請問最少稱幾回能夠找出假幣?

    3次可稱出。方法以下:

    1:將12個硬幣分紅3等分,任意兩份上⚖️,有2種結果:

        1.1平衡    (可知,假幣在沒上天平的這份裏)

            2 從沒上天平的4個硬幣裏隨便拿兩個上天平

                2.1 平衡    (可知,假幣在沒上天平的這兩個裏) 

                    3.將天平上任意一個替換沒上⚖️這裏的一個 

                        3.1 平衡,說明剩下這個是假幣

                        3.2不平衡,說明剛拿上來的這個是假幣

                2.2 不平衡 (可知,假幣在上天平的這兩個裏)

                    3.將任意一個幣替換天平上的任意一個

                        3.1平衡  說明被替換的是假幣

                        3.2不平衡 說明未被替換的是假幣

        1.2不平衡 (可知,假幣在上天平的這兩份裏)

            給天平上硬幣編號:左邊爲1234,右邊爲5678。

            將678拿走,34放在右邊,再拿一個真的放在右邊,5放在左邊。

            2.天平此時左邊125,右邊34真。

                2.1 平衡,可知假幣在678裏,根據1.2時不平衡時,5678是高仍是低,知道假幣是輕是重

                    3.將67放在天平上,

                       3.1平衡 說明8是假幣

                       3.2 不平衡,結合假幣是輕重的結論可知哪一個是假幣。

                2.2 不平衡 (結合1.2假幣是輕重,繼續判斷)

                    能夠判斷,是12裏有假幣/34裏有假幣/5是假幣,

                3.在用真的對比測出結論

 

 

 

 

 

 

 

 

 

 

http://www.cnblogs.com/skywang12345/category/508186.html

 

https://mp.weixin.qq.com/s/L2aHTwMypVB5eH0Wu9X28A

相關文章
相關標籤/搜索