Search in Rotated Sorted Array

来源:互联网 发布:淘宝开抢是什么意思 编辑:程序博客网 时间:2024/05/16 09:51

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.

思路:采用二分查找的思想,每次缩小区间的一半,由于是循环数组,所以要好好判断分区间的条件。容易知道数组分成两半,并且两半都是有序的,并且后一半的数总是小于前一半的数。每次先找出区间的最中间的数nums[mid],将最中间的数与数组最右边的数nums[right]比较,如果nums[mid]小于nums[right]说明mid到right之间的数是从小到大排列的,这时如果target在这个序列之间,那么就得出target在后一半区间,否则就是在前一半区间。
如果nums[mid]大于nums[right],这说明前一半数字是有序的,如果target在nums[left]和nums[mid]之间,就说明区间在前一半,否则区间在后一半。如此重复,不断缩小区间,直到return,找不到最后就return -1.

public class Solution {    public int search(int[] nums, int target) {            int left = 0;        int right = nums.length - 1;        int mid = 0;        while (left <= right && left <= (nums.length - 1)                && right <= (nums.length - 1)) {            mid = (left + right) / 2;            if (target == nums[left])                return left;            if (target == nums[right])                return right;            if (nums[mid] == target)                return mid;            else if (nums[mid] <= nums[right]) {                if (target < nums[right] && target > nums[mid])                    left = mid + 1;                else                    right = mid - 1;            } else {                if (target > nums[left] && target < nums[mid])                    right = mid - 1;                else                    left = mid + 1;            }        }        return -1;    }}
0 0
原创粉丝点击