时间复杂度
经验
- 比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
二分答案
- 肯定答案的范围
- 在答案范围内二分检测