經驗總結
- 二分中點的確定:int mid = start + (end - start) / 2;
LintCode: 457. 經典二分查找問題
LintCode: 14. 二分查找
LintCode: 585. 山脈序列中的最大值
LintCode: 75. 尋找峯值
旋轉數組的最小數字
LintCode: 159. 尋找旋轉排序數組中的最小值
LintCode: 160. 尋找旋轉排序數組中的最小值 II
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) 等?
(數據結構)十分鐘搞定時間複雜度(算法的時間複雜度)