import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param arr int整型一维数组
     * @param target int整型
     * @return int整型
     */
    public int search(int[] arr, int target) {
        if (arr == null || arr.length == 0) {
            return -1;
        }

        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // 如果中间元素等于目标
            if (arr[mid] == target) {
                // 继续向左搜索最小的索引
                while (mid > 0 && arr[mid - 1] == target) {
                    mid--;
                }
                return mid;
            }

            // 如果中间元素大于左边界元素,说明左半部分是有序的
            if (arr[mid] > arr[left]) {
                // 如果目标在左半部分有序数组中,更新右边界为 mid - 1
                if (target >= arr[left] && target < arr[mid]) {
                    right = mid - 1;
                } else {
                    // 否则更新左边界为 mid + 1
                    left = mid + 1;
                }
            } else if (arr[mid] <
                       arr[left]) { // 如果中间元素小于左边界元素,说明右半部分是有序的
                // 如果目标在右半部分有序数组中,更新左边界为 mid + 1
                if (target > arr[mid] && target <= arr[right]) {
                    left = mid + 1;
                } else {
                    // 否则更新右边界为 mid - 1
                    right = mid - 1;
                }
            } else { // 如果中间元素等于左边界元素,无法判断哪一部分是有序的
                // 缩小搜索范围,去掉左边界元素
                left++;
            }
        }

        return -1; // 没有找到目标元素
    }
}

本题知识点分析:

1.二分查找

2.数组遍历

3.数学模拟

本题解题思路分析:

1.如果中间元素等于目标,继续向左搜索最小的索引

2.如果中间元素大于左边界元素,说明左半部分是有序的

3.如果中间元素小于左边界元素,说明右半部分是有序的

4.然后就是分别判断目标是在左半区域还是右半区域

5.如果没有找到目标数组就返回-1

本题属于纯数学模拟+一点二分查找,你要跟别人解释其实也就那样,看了题解就恍然大悟,属于背题类

本题使用编程语言: Java

如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~