Search in Rotated Sorted Array

来源:互联网 发布:网络优化大师.apk 编辑:程序博客网 时间:2024/06/03 18:12

原题:

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.

即给定一个从小到大排好序的数组以某个元素为旋转点旋转之后形成的数组。这个旋转不是平时理解的旋转,像是根据某个点将数组分成两段后交换顺序。从这个数组里找到值为target的元素,给出索引,如果没有,返回-1。


思考过程:

一开始想到遍历整个数组是很简单的,o(n)。但既然排好序就应该用二叉搜索的思想。至少有递归思想。这个数组经过截取一定有一半是sorted array(排好序的数组)的。


解题思路:

用递归思想,判断target在左边一段还是右边一段:

判断左右哪段是sorted array,判断它是否在这个sorted array范围之内,如果不是,遍历另一段。

如果这段数组只剩两个元素,判断这两个元素是否和target相等,如果不想等,返回-1.


结果代码:

public int search(int[] nums, int target) {        if (nums.length == 0)return -1;        return  searchInRotatedArray(nums,0,nums.length - 1,target);    }    public int searchInRotatedArray(int[] nums,int begin,int end,int target){        int midium = (begin + end) / 2;        if (midium == begin) {            if (nums[midium] == target) return midium;            if (nums[end] == target) return end;            else return -1;        }        if (nums[midium] > nums[begin]) {            if (target <= nums[midium] && target >= nums[begin]) return searchInRotatedArray(nums, begin, midium, target);            else return searchInRotatedArray(nums,midium,end,target);        }        if (nums[midium] < nums[end]) {            if (target >= nums[midium] && target <= nums[end]) return searchInRotatedArray(nums, midium, end, target);            else return searchInRotatedArray(nums, begin, midium, target);        }        return -1;    }