• 考察条件分类
    • 考你尽可能地去二分,怎么写这个代码


原题(无重复)

https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/

力扣的这个题是数组里面每个数都是独一无二的,无重复的情况

  • 这个转 —-> 只能左侧转到右边去
  • 尽量有序的部分二分

    1. public static int search(int[] arr, int num) {
    2. int n = arr.length;
    3. if (n == 0) {
    4. return -1;
    5. }
    6. if (n == 1) {
    7. return arr[0] == num ? 0 : -1;
    8. }
    9. int l = 0, r = n;
    10. while (l < r) {
    11. int mid = (l + r) >> 1;
    12. if (arr[mid] == num) {
    13. return mid;
    14. }
    15. if (arr[0] < arr[mid]) {
    16. if (arr[0] <= num && num < arr[mid]) {
    17. r = mid;
    18. } else {
    19. l = mid + 1;
    20. }
    21. } else { // arr[0] > arr[mid]
    22. if (arr[mid] < num && num <= arr[n - 1]) {
    23. l = mid + 1;
    24. } else {
    25. r = mid ;
    26. }
    27. }
    28. }
    29. return -1;
    30. }

    进阶 (有重复)

  • 若是数组中可以有重复的元素呢?该怎么写条件?

    记住结论:三个点L M R,只要三个位置不都相等,就可以二分

  • 若三个点的元素都相同,是没办法二分的

image.png

记住结论:三个点L M R,只要三个位置不都相等,就可以二分

若三个点相同,则是没有办法二分的
image.png

L往右直到发现不等于M位置的值了,右边部分去二分
image.png
若L和M撞上了,那么
image.png

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