题目描述
有一个排过序的数组,包含n个整数,但是这个数组向左进行了一定长度的移位,例如,原数组为[1,2,3,4,5,6],向左移位5个位置即变成了[6,1,2,3,4,5],现在对于移位后的数组,需要查找某个元素的位置。请设计一个复杂度为log级别的算法完成这个任务。
给定一个int数组A,为移位后的数组,同时给定数组大小n和需要查找的元素的值x,请返回x的位置(位置从零开始)。保证数组中元素互异。
测试样例:
[6,1,2,3,4,5],6,6
返回:0
思路:
还是二分查找没变。变得是每次调整end 和start 的时候,需要把可能的乱序情况考虑进去。
当 A[mid] < x 的时候, 乱序是X 在数组的前半段,因为数组中大的都被移到的前面。
那么一定需要条件 X > A[end] 并且 A[mid] < A[Start]。
当A[mid] > x 的时候, 乱序是X 在数组后面。也就是 小数在数组的最后面。
那么一定有 A[mid] > A[start] && x < A[start]
其他的情况就是正常的二分查找。
class Finder {
public:
int findElement(vector<int> A, int n, int x) {
int left=0,right