Search in Rotated Sorted Array

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

题目中给定了一个有序数组,但是数组以某个元素作为支点进行了旋转,然后再旋转后的数组中查找目标数字。
这道题我们可以用二分法来解决。二分查找之所以能提高效率就是每次搜索后都可以去掉一半的元素,然后再从剩下的一半元素中查找。这道题的关键点就是每次操作后我们要确定一个有序的序列。当我们得到中间元素m时,如果m元素与target相等,我们就可以直接返回m的下标。如果不相等,我们可以把m元素与左边的第一个元素l相比,如果m元素小于l元素,那么就说明m后面的元素肯定是有序的,我们就从后半部分处理,查看target是否在后半个区域,如果在,我们就让l = m + 1; 如果不在,我们就让l = m - 1。如果m元素大于l元素,则说明m左边的是有序数列,我们就从前半部分处理,如果target在前半部分,让r = m - 1;如果不在,让l = m + 1。代码如下:
public class Solution {
    public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0) return -1;
        int l = 0;
        int r = nums.length - 1;
        while(l <= r) {
            int m = l + (r - l) / 2;
            if(nums[m] == target) return m;
            if(nums[m] < nums[l]) {
                if(target > nums[m] && target <= nums[r]) {
                    l = m + 1;
                } else {
                    r = m - 1;
                }
            } else {
                if(target >= nums[l] && target < nums[m]) {
                    r = m - 1;
                } else {
                    l = m + 1;
                }
            }
        }
        return -1;
    }
}

你可能感兴趣的:(java,二分法)