LeetCode81 搜索旋转排序数组 II

二分查找,但是下面的代码在测试用例[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;
}

}

猜你喜欢

转载自blog.csdn.net/qq_31617121/article/details/80844740
今日推荐