题解 | #牛牛的旋转搜索#
牛牛的旋转搜索
https://www.nowcoder.com/practice/7ddbbc6318644fc18607b982ea4dc3d3?tpId=363&tqId=10615049&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D363
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
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~

字节跳动公司福利 1309人发布