leetCode-Search in Rotated Sorted Array

来源:互联网 发布:手机锁帧软件 编辑:程序博客网 时间:2024/06/05 15:07

Description:
Suppose an array sorted in ascending order 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.

My Solution:

//想法是先找到pivot point,然后将nums回复成递增数组(再次旋转len - 旋转点),然后使用二分查找class Solution {    public int search(int[] nums, int target) {        int len = nums.length;        if(len == 0){            return -1;        }        int index = 0;        for(int i = 1;i < len;i++){            if(nums[i] < nums[i - 1]){                index = i;                break;            }        }        if(index != 0){            int rotate =  len - index;            int[] part1= Arrays.copyOf(nums,len-rotate);            int[] part2=Arrays.copyOfRange(nums,len-rotate,len);            System.arraycopy(part2,0,nums,0,part2.length);            System.arraycopy(part1,0,nums,part2.length,part1.length);        }        int left = 0;        int right = len - 1;        int middle = (left + right) / 2;        while(left <= right){            if(nums[middle] == target){                return (middle + index) % len;            }            if(nums[middle] > target){                right = middle - 1;            }else{                left = middle + 1;            }            middle = (left + right) / 2;        }        return -1;    }}

Better Solution:

//直接使用二分查找,如果nums[mid] < nums[right],相当于middle在'右边'的递增序列,//如果满足nums[mid] < target && target <= nums[right]的条件,那么可以直接在右边的递增序列中二分查找,将left赋值为mid+1,否则,有两种可能,一种是可以在右边二分查找,一种是在左边二分查找,将right赋值为mid - 1,当nums[mid] < target && target <= nums[right]的时候是一样的。class Solution {    public int search(int[] nums, int target) {        if(nums == null || nums.length == 0) return -1;        int n = nums.length;        int left = 0; int right = n - 1;        while(left <= right) {            int mid = left + (right - left) / 2;            if(nums[mid] == target) return mid;            if(nums[mid] < nums[right]) {                if(nums[mid] < target && target <= nums[right]) left = mid + 1;                else right = mid - 1;            } else {                if(nums[left] <= target && target < nums[mid]) right = mid - 1;                else left = mid + 1;            }        }        return -1;    }    // 0 1 2 3 4 5 6 7    // 6 7 0 1 2 3 4 5    // 2 3 4 5 6 7 0 1}