题目如图所示
解题思路该反转只有第一反转偏左或者偏右和后面查询的数在顺序的区间内以下是我的解题代码有注释已经通过
解题代码如下
class Solution {
public int search(int[] array, int t) {
//如果数组为空直接返回
if (array.length == 0) {
return -1;
}
//l为左边界,r为右边界 t为查询值
int l = 0, r = array.length - 1, m;
while (l <= r) {
//取中间值 这么计算避免溢出
m = r+(l-r)/2;
//如果相等返回索引
if (t == array[m]) {
return m;
}
//如果中间索引的值比左边界小证明反转的编左边此时考虑m的位置
else if (array[m] < array[l] ) {
//如果t<中间的值如果m在该数组中只能在左边
if (t < array[m]){
r=m-1;
}else {
//如果t>中间值此时可能在左侧也可能在右侧
//t<如果小于左边界的最小值那么他只能在右侧反之在左侧或者不在数组中
if (t<array[l]){
l=m+1;
}else {
r=m-1;
}
}
}
//如果中间索引的值比右边界大证明反转的编右边此时考虑m的位置
else if (array[m] > array[r] ) {
//如果t>中间的值如果m在该数组中只能在右边
if (t > array[m]){
l = m + 1;
}else {
//如果t<中间值此时可能在左侧也可能在右侧
//t<如果小于左边界的最小值那么他只能在左侧反之在右侧或者不在数组中
if (t<array[l]){
l = m + 1;
}else {
r = m - 1;
}
}
}//当处在不在反转的位置中进行正常的2分查找
else {
if (t>array[m]) {
l=m+1;
}else if (t<array[m]){
r=m-1;
}
}
}
return -1;
}
}