時間複雜度
經驗
- 比O(n)更優的時間複雜度幾乎只能是O(logn)的二分法
- 根據時間複雜度倒推算法能夠做爲面試策略。
二分法
- 使用Recursion(遞歸)仍是Non-Recursion(非遞歸)
- 面試官要求不使用Recursion
- 不用Recursion是否會形成實現很複雜
- Recursion的深度是否會很深
- 考點是Recursion vs Non-Recursion。有可能就是在考你是否是會Recursion
- 記住不要本身亂判斷,和麪試官討論
通用模板的四點要素
- 循環結束條件:
start + 1 < end;
mid = start + (end - start) / 2
- 判斷
A[mid] ==, <, >
- double check:
A[start] A[end] ? target
public class Solution {
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
public int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0){
return -1;
}
int start = 0, end = nums.length - 1;
//相鄰就退出
while (start + 1 < end){
int mid = (end - start)/2 + start;
if (target == nums[mid]){
return mid;
}else if (target < nums[mid]){
end = mid;
}else {
start = mid;
}
}
//double check
if (nums[start] == target){
return start;
}
if (nums[end] == target){
return end;
}
return -1;
}
}
複製代碼
二分位置 之 OOXX
二分位置 之 Half half
二分答案
- 肯定答案的範圍
- 在答案範圍內二分檢測