算法-查找 & 排序

經驗總結

  1. 二分中點的確定:int mid = start + (end - start) / 2;

LintCode: 457. 經典二分查找問題
LintCode: 14. 二分查找
LintCode: 585. 山脈序列中的最大值
LintCode: 75. 尋找峯值
旋轉數組的最小數字
LintCode: 159. 尋找旋轉排序數組中的最小值
LintCode: 160. 尋找旋轉排序數組中的最小值 II

LeetCode:1. 兩數之和

LeetCode:1. 兩數之和

解法一:一遍哈希表

遍歷數組nums,將數組中的各個元素放入map(以數組值nums[i]爲map的key,以數組下標i爲map的value);
在向map中添加元素之前,先檢查map中是否包含(target-nums[i])的值;
若包含(target-nums[i])的值,說明查找到對應的兩個數,返回其下標;
若未包含(target-nums[i])的值,則將數組對應元素nums[i]放入map中;
若遍歷完數組,map中都不含對應兩個元素,說明數組中不存在這樣的兩個元素,返回爲空;

  • 時間複雜度:O(n)
    遍歷包含n個元素的數組,所以時間複雜度爲O(n);map中的查找由於是hash的過程,所以查找時間複雜度爲O(1)
  • 空間複雜度:O(n)
    創建了大小爲n的map,所以空間複雜度爲O(n)

Golang: one-hash

解法二:兩遍哈希表

遍歷數組nums,將數組中的各個元素放入map(以數組值nums[i]爲key,以數組下標爲value);
遍歷數組nums,以數組nums爲基準,判定(target-nums[i])的值是否包含在map中;
若(target-nums[i])的值包含在map中,則說明數組中包含對應的兩個元素,返回其下標;
若遍歷完數組nums,都不包含對應的兩個元素,則返回爲空;

  • 時間複雜度:O(n)
    時間複雜度主要消耗在數組的遍歷過程,數組長度爲n,所以遍歷數組的時間複雜度爲O(n);
  • 空間複雜度:O(n)
    空間複雜度主要消耗在map中,map的長度爲數組的長度,所以空間複雜度爲O(n);

Golang: two-hash

歸併排序

算法思想

歸併排序利用分治思想二分思想,在數據的分割上利用二分思想,在數據的合併及排序上利用分治思想
歸併排序基於分治思想,將多個已排好序的數組合併成一個有序的數組.

歸併排序的分類

二路歸併排序

具體做法爲:遍歷兩個數組,比較它們的值。誰比較小,誰先放入大數組中,直到數組遍歷完成

多路歸併排序

算法複雜度

平均時間複雜度:O(nlogn)

參考代碼

Java參考代碼: MergeSort.java
Go參考代碼: merge_sort_test.go

參考文檔

歸併排序就這麼簡單
歸併排序及優化(Java實現)
Go數據結構與算法-歸併排序

冒泡排序

冒泡排序就這麼簡單
如何理解算法時間複雜度的表示法,例如 O(n²)、O(n)、O(1)、O(nlogn) 等?
(數據結構)十分鐘搞定時間複雜度(算法的時間複雜度)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章