重复数字有序数组——二分查找
二分查找
http://www.nowcoder.com/questionTerminal/7bc4a1c7c371425d9faa9d1b511fe193
题目关键词:
- 有序数组;
- 重复数字;
- 返回值为从1开始计数的位置索引;
思路一
- 使用二分查找方法,找到array[index1] ≥ target,记录index1, 然后线性递减index1,查找最早出现的满足题目要求的index0;
- 最坏情况下,arry数组中的数字完全一样,二分查找的时间复杂度O(logN);
- 最好情况下,index1即为题目所求位置索引,时间复杂度为O(1);
思路二
- 在思路一中,当找到index1之后,是否还可以继续使用二分查找呢?
- 当然可以,继续二分查找,只要负责遍历的左右指针直接还有元素,二分查找就会一直及逆行下去;
- 直到左右指针相等,即 left == right;
- 此时,只需要判断array[right] >= target 是否成立;
- 若成立,则说明当前位置即为题目所求;
- 若不成立,则说明right已经是数组array的最右侧,找不到符合要求的元素,因此返回len(array)+1;
- 时间复杂度:因为二分查找要完全进行到底,所以时间复杂度始终是O(logN);
以上两种思路仅为个人理解,仅供参考~