- 考察条件分类
- 考你尽可能地去二分,怎么写这个代码
原题(无重复)
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/
力扣的这个题是数组里面每个数都是独一无二的,无重复的情况
- 这个转 —-> 只能左侧转到右边去
尽量有序的部分二分
public static int search(int[] arr, int num) {int n = arr.length;if (n == 0) {return -1;}if (n == 1) {return arr[0] == num ? 0 : -1;}int l = 0, r = n;while (l < r) {int mid = (l + r) >> 1;if (arr[mid] == num) {return mid;}if (arr[0] < arr[mid]) {if (arr[0] <= num && num < arr[mid]) {r = mid;} else {l = mid + 1;}} else { // arr[0] > arr[mid]if (arr[mid] < num && num <= arr[n - 1]) {l = mid + 1;} else {r = mid ;}}}return -1;}
进阶 (有重复)
若是数组中可以有重复的元素呢?该怎么写条件?
记住结论:三个点L M R,只要三个位置不都相等,就可以二分
- 若三个点的元素都相同,是没办法二分的

记住结论:三个点L M R,只要三个位置不都相等,就可以二分
若三个点相同,则是没有办法二分的
L往右直到发现不等于M位置的值了,右边部分去二分
若L和M撞上了,那么

L > M , 说明M往右是有序的,那么先去右侧有序的部分二分看num在不在里面,否则再去左边二分
