**区间缩小-> 剩下两个下标->判断两个下标**
1. 这两个下标根据先要end还是先要start先后顺序会有不同。
2. 如果没有target出现,令start = mid, end = mid不会影响结果。你只要让问题的规模缩小即可。因为start和end不管是否包括mid值都不影响最后的结果
**注:不要把缩小区间和得到答案放在一个循环里面,容易出问题,增加难度**
给定一个排序的整数数组(升序)和一个要查找的整数
target
,用O(logn)
的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1
。样例
在数组
[1, 2, 3, 3, 4, 5, 10]
中二分查找3
,返回2
。
这个题应该是Binary Search最基础的题,直接套用模版就可以,以下是这个题的代码(Bug Free):
int binarySearch(vector<int> &array, int target) { if (!array.size()) return -1; int start = 0, end = array.size() - 1; while (start < end) { int mid = (start + end) >> 1; if (array[mid] < target) { start = mid + 1; } else if (array[mid] > target) { end = mid -1; } else { end = mid; } } if (array[start] == target) return start; return -1; }
递归写法:
1. 写个helper
2. 把while循环相反的条件当成base case
3. 改坐标变成了recursion函数里面改坐标