(Java)LeetCode-33. Search in Rotated Sorted Array

来源:互联网 发布:mac dock栏恢复默认 编辑:程序博客网 时间:2024/05/16 15:33

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.


这道题,就是一个递增的数组被拆成两半,前后调换了顺序。让你从中找一个数。这题是Hard难度。

一个有趣的尝试,就是从前到后遍历数组,居然也可以Accept,时间也很短,1ms,不过我估计这不是出题人的意图。。

这次肯定会用到二分查找,递归。

我是这样想的:

找到数组中间的数nums[mid],如果比nums[left]大,则说明前一半数组还处在第一段里。这个时候如果nums[left] <= target <= nums[mid] 则用二分法查找前半部分即可

如果target不再这个范围内,则可能在后半部分中,后半部分和整个数组的情况是一样的,是被分成两半的递增数组,递归调用此方法即可。

如果数组中间的数nums[mid]比nums[left]小,则说明后一半数组已经处在第二段里,是个递增数组,这个时候如果nums[mid] <= target <= nums[right] 则用二分法查找后半部分即可,如果target不再这个范围内,则可能在前半部分中,前半部分和整个数组的情况是一样的,是被分成两半的递增数组,递归调用此方法即可。代码如下:


package datastru;public class Solution {    public int search(int[] nums, int target) {        return search(nums, target, 0, nums.length-1);    }private int search(int[] nums, int target, int left, int right) {// TODO Auto-generated method stubif(left == right){if(nums[left] == target){return left;}else{return -1;}}int mid = (left + right)/2;if(nums[mid] >= nums[left]){if(nums[left] <= target && target <= nums[mid]){return binarySearch(nums,target,left,mid);}else{return search(nums,target,mid+1,right);}}else{if(nums[mid] <= target && target <= nums[right]){return binarySearch(nums,target,mid,right);}else{return search(nums,target,left,mid);}}}private int binarySearch(int[] nums, int target, int left, int right) {// TODO Auto-generated method stubif(left == right){if(nums[left] == target){return left;}else{return -1;}}int mid = (left + right)/2;if(target < nums[mid]){return binarySearch(nums,target,left,mid);}else if(target == nums[mid]){return mid;}else{return binarySearch(nums,target,mid+1,right);}}public static void main(String[] args){Solution sol = new Solution();int[] nums = {4,5,6,7,0,1,2};System.out.println(sol.search(nums, 3));}}





0 0