题目:一个有序数组,把它左移几位,末尾的数转移到开头。依次作为输入:
例如
1 2 3 4 5 6 7
变成
4 5 6 7 1 2 3
要求在其中搜索查找target,返回其位置,如果找不到,返回-1。
思路一:
先用二分查找找原有序数组的开头被弄到哪,即最小的数位置。
查找时,如果mid>=数组开头,说明最小数在右半边,否则在左半边。
然后再用二分查找找target,查找时把下标加上最小数的位置并对数组大小取模。
这是一个最直接的想法,C++实现后在LeetCode上运行时间7ms。
思路二:
不需要用两次二分查找,直接找target:
由于二分后数组中必然有一半是有序的,所以二分查找时要分情况讨论:
如果mid>=left,说明左半部分是有序的。判断是否有left<=target<=mid,是的话target在左半边,否则在右半边。
如果mid