二分查找,但是下面的代码在测试用例[3,1] 1中出错。
package 牛客刷题.LeetCode.查找.search_in_rotated_sorted_array_ii;
/**
* Created by Administrator on 2018/6/28 0028.
*/
public class Solution {
public static void main(String[] args) {
int[] arr = {2, 5, 6, 0, 0, 1 ,2};
System.out.println(search(arr, 0));
System.out.println(search(arr, 3));
}
public static boolean search(int[] A, int target) {
int m = A.length;
int low = 0, high = m -1;
int middle;
while (low <= high) {
middle = low + (high - low) / 2;
if (A[middle] == target) {
return true;
}
if (A[middle] == A[low] && A[middle] == A[high]) {
++low;
--high;
} else if (A[low] <= A[middle]){
//middle左边有序
if (A[middle] < target) {
low = middle +1;
} else {
//target只能在low和middle之间(不包含)找,其他地方不可能了
high = middle -1;
}
} else {
//middle右边有序
if (A[high] < target) {
high = middle -1;
} else {
low = middle + 1;
}
}
}
return false;
}
}
通过版本 在判断出左边还是右边是有序数组后,判断逻辑写错了。
判断target是不是在有序数组上面上面,如果在的话就在有序数组上查找,不在的话在其他地方查找。
package 牛客刷题.LeetCode.查找.search_in_rotated_sorted_array_ii;
/**
* Created by Administrator on 2018/6/28 0028.
*/
public class Solution {
public static void main(String[] args) {
//int[] arr = {2, 5, 6, 0, 0, 1 ,2};
//System.out.println(search(arr, 0));
//System.out.println(search(arr, 3));
int[] arr1 = {3, 1};
System.out.println(search(arr1, 1));
}
public static boolean search(int[] A, int target) {
int m = A.length;
int low = 0, high = m -1;
int middle;
while (low <= high) {
middle = low + (high - low) / 2;
if (A[middle] == target) {
return true;
}
if (A[middle] == A[low] && A[middle] == A[high]) {
++low;
--high;
} else if (A[low] <= A[middle]){
//middle左边有序
if (A[low] <= target && target < A[middle]) {
high = middle -1;
} else {
//target只能在low和middle之间(不包含)找,其他地方不可能了
low = middle +1;
}
} else {
//middle右边有序
if (A[middle] < target && target <= A[high]) {
low = middle + 1;
} else {
high = middle -1;
}
}
}
return false;
}
}