美文网首页
Leetcode33:搜索旋转排序数组

Leetcode33:搜索旋转排序数组

作者: VIELAMI | 来源:发表于2020-04-27 15:41 被阅读0次

【题目描述】

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

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

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

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

你的算法时间复杂度必须是 O(log n) 级别。

【思路】

1. 整体与二分查找相似

2. 左边有序:target在左边(判断条件 (nums[left] <= target)&&(target <= nums[mid]))or target在右边(判断条件 上一条的else)

右边有序:target在右边(判断条件)

【问题】

1. 二分查找时注意边界值,这次用的是闭区间

2. C++ 不可三个比较 要用&&连接

3. 第一次写的时候判断左边有序还是右边有序的条件错误,

```

if (nums[left] < nums[mid])

// 错误的用例 {3,1}

```

此时left = mid 会导致进入不了任何一个if条件

所以要有等号

【代码】

```

class Solution {

public:

    int search(vector<int>& nums, int target) {

        if(nums.size()==0) return -1;

            int res = helpSearch(nums, target, 0, nums.size() - 1);

            return res;

    }

    int helpSearch(vector<int>& nums, int target, int left, int right) {

    int mid = (left + right) / 2;

    if (nums[mid] == target) return mid;

        if (left == right) {

        return -1;

    }

    else {

        if (nums[left] <= nums[mid]) {

            //左边有序

            if ((nums[left] <= target)&&(target <= nums[mid])) {

                //target在左边

                return helpSearch(nums, target, left, mid);

            }

            else {

                //target不在左边

                return helpSearch(nums, target, mid + 1, right);

            }

        }

        if (nums[mid] <= nums[right]) {

            //右边有序

            if ((nums[mid] <= target)&&(target <= nums[right])) {

                //target在右边

                return helpSearch(nums, target, mid + 1, right);

            }

            else {

                //target不在右边

                return helpSearch(nums, target, left, mid);

            }

        }

    }

    return -1;

}

};

```

【result】

相关文章

网友评论

      本文标题:Leetcode33:搜索旋转排序数组

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