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
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~