美文网首页
搜索旋转数组

搜索旋转数组

作者: 最困惑的时候就是能成长的时候 | 来源:发表于2019-04-08 09:45 被阅读0次

搜索旋转数组

1.想法:

如果是拍好序的数组,那么直接使用二分查找进行搜索,现在旋转了后,我们可知至少有两段是有序的,有题意可知复杂度是你的算法时间复杂度必须是 O(log n) 级别。那么就是说一定是将子问题划归为两半进行处理,像二分查找一样。
那么我们观察一下数组结构:,可以发现有如下规律

image.png
无论怎么旋转,至少有一边的顺序和中间值组成的顺序是有序的,例如1,2,3,4,0从1->3是有序的,而从3->0是无序的(且和原问题的结构一样),那么我们可以做出一下结论:
1.如果所搜索的数在有序的数组内,直接使用二分查找,在另一边(可能无序)当做原问题的子问题处理
2.我们需要对target与mid的关系进行分类
image.png

2.代码实现:

public int search(int[] nums, int target) {
         return searchInnums(nums,target,0,nums.length-1);
    }

    private int searchInnums(int[] nums, int target, int start, int end) {
        if(start>end)return -1;
        else{
            int mid = nums[(end-start)/2+start];
            if(mid == target)return (end-start)/2+start;
            if(mid<target){                                      //情况一
                if(nums[end] == target)return end;
                if(nums[end]>mid) {
                    if(nums[end]>target)return MybinarySearch(nums,target,(end-start)/2+start+1,end);//原问题
                    else return searchInnums(nums,target,start,(end-start)/2+start-1);//二分查找
                }else{
                    return searchInnums(nums,target,(end-start)/2+start+1,end-1);
                }
            }else{
                if(nums[start] == target)return start;
                if(nums[start]>mid) {
                    return searchInnums(nums,target,start+1,(end-start)/2+start-1);
                }else{
                    if(nums[start]>target)return searchInnums(nums,target,(end-start)/2+start+1,end);
                    else return MybinarySearch(nums,target,start+1,(end-start)/2+start-1);
                }
            }
        }
    }

    private int MybinarySearch(int[] nums, int target, int start, int end) {
        if(start>end)return -1;
        int mid = nums[(end-start)/2+start];
        if(mid == target)return (end-start)/2+start;
        else if(mid>target) return MybinarySearch(nums,target,start,(end-start)/2+start-1);
        else return MybinarySearch(nums,target,(end-start)/2+start+1,end);
    }
image.png

相关文章

  • 2020-2-16 刷题记录

    0X00 leetcode 刷题 7 道 搜索旋转排序数组(33) 搜索旋转排序数组 II(81) 寻找旋转排序数...

  • 解题报告 - 搜索旋转排序数组

    解题报告 - 搜索旋转排序数组 LeetCode 搜索旋转排序数组 @TOC[%E6%96%87%E7%AB...

  • [Leetcode] 33. 搜索旋转排序数组

    33. 搜索旋转排序数组 来源: 33. 搜索旋转排序数组 1. 解题思路 二分法查找 2. 代码

  • 搜索旋转数组

    搜索旋转数组 1.想法: 如果是拍好序的数组,那么直接使用二分查找进行搜索,现在旋转了后,我们可知至少有两段是有序...

  • 33. 搜索旋转排序数组

    33. 搜索旋转排序数组 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,...

  • LeetCode:搜索旋转排序数组

    搜索旋转排序数组 题目叙述: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,...

  • 需要牢记的二分法基础模板

    搜索旋转排序数组 click here for leetcode detail[https://leetcode-...

  • LeetCode 33

    搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6...

  • 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 ...

  • 搜索旋转有序数组

    描述Suppose a sorted array is rotated at some pivot unknown...

网友评论

      本文标题:搜索旋转数组

      本文链接:https://www.haomeiwen.com/subject/covyiqtx.html