leetcode33搜索旋转排序数组

leetcode33搜索旋转排序数组
要求:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。
例如:4,5,6,7,8,1,2,3 搜索7
输出:3
解法:这道题是中等难度的题目,评测的不错,缺失难度还差不多,就是一道二分查找的升级版。
旋转数组有两种类型:
一种是左边有序的多一点,例如 2 3 4 5 6 7 1
还一种是是右边有序的多一点,例如 7 1 2 3 4 5 6

对于第一种情况,我们定义low=0,high=6,mid=(low+high)/2=3
搜索1试试,1<5&&1<2,,所以1肯定不在左边,low=mid+1=4,high=6,mid=5
1<7&&1<6,所以1肯定不在左边,low = mid+1=6,high=6,mid=6
1=nums[6]return 6;
再搜索3试试
3<5&&3>2,所以3肯定在左边,high=mid-1=2,low=0,mid=1
3=nums[1]return 1;

第二种情况差不多,自己试下吧

	public int search(int[] nums, int target) {
        if(null==nums||nums.length==0)
            return -1;
        int low = 0;
        int high = nums.length-1;
        while(low<=high) {
           int mid = (low + high) >>> 1;
           //左边有序的多 2 3 4 5 6 7 1
            if(nums[mid]>=nums[high]){
                if (target == nums[mid]) {
                    return mid;
                } else if (target >= nums[low] && target < nums[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }else{  //右边有序的多 7 1 2 3 4 5 6
                if (target == nums[mid]) {
                    return mid;
                } else if (target <= nums[high] && target > nums[mid]) {
                    low = mid + 1;
                } else {
                    high = mid - 1;
                }
            }
        }
        return -1;
    }
发布了127 篇原创文章 · 获赞 68 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LiuRenyou/article/details/100577598
今日推荐