其实也就是分三种情况就是重点值大于小于等于last值,这是建立在数组有序的基础上,就算是两段,也是局部有序的。 0.二分法之后的中点要跟一个锚点比较用于下一次更新mid,本题中锚点只能选择右端点,因为题目旋转是向右旋转的不管是否旋转到尾部(旋转的数多或旋转点靠前)

  1. 情况1,arr[mid] > target:4 5 6 1 2 3 arr[mid] 为 6, target为右端点 3, arr[mid] > target, 说明[first ... mid] 都是 >= target 的,因为原始数组是非递减,所以可以确定答案为 [mid+1...last]区间,所以 first = mid + 1

  2. 情况2,arr[mid] < target:5 6 1 2 3 4 arr[mid] 为 1, target为右端点 4, arr[mid] < target, 说明答案肯定不在[mid+1...last],但是arr[mid] 有可能是答案,所以答案在[first, mid]区间,所以last = mid;

  3. 情况3,arr[mid] == target: a)如果是 1 0 1 1 1, arr[mid] = target = 1, 显然答案在左边 b)如果是 1 1 1 0 1, arr[mid] = target = 1, 显然答案在右边 所以这种情况,不能确定答案在左边还是右边,那么就让last = last - 1;慢慢缩少区间,同时也不会错过答案。(如情况a,last会走到m的左边,然后又重回m,eg:1 0 1 1 1 1)