时间复杂度
经验
- 比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
- 74. 第一个错误的代码版本
- 搜索无限长度的排序数组
- 难点:确定右边界
end - 解决方式:倍增思想
int index = 1; while (nums[index - 1] < target){ index = index * 2; } int start = 0, end = index - 1; //正常二分搜索 - 难点:确定右边界
- 159. 寻找旋转排序数组中的最小值
二分位置 之 Half half
二分答案
- 确定答案的范围
- 在答案范围内二分检测