[Leetcode] Search in Rotated Sorted Array

来源:互联网 发布:spss17.0软件下载 编辑:程序博客网 时间:2024/05/16 04:35

描述

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.

分析1

给定一个数组,查找某个数是否在这个数组中,这个数组是一个有序数组经过循环移位构成的。

很明显这道题应该用二分查找的方法来做,主要的难点在于怎么缩小查找的范围。

对于一个循环移位数组,它只有三种可能:
1. 没有移位,此时 nums[lo]<nums[mi]<nums[hi] ,整体有序,可以用标准的二分查找来找。
2. 移位,且初始值在 nums[mi] 左边,此时 nums[mi]<nums[lo]<nums[hi],右半部分有序,通过判断 nums[mi]<target<nums[hi] 是否成立来选择往左半部分还是右半部分查找。
3. 移位,且初始值在 nums[mi] 右边,此时 nums[hi]<nums[lo]<nums[mi],左半部分有序,通过判断 nums[lo]<target<nums[mi] 是否成立来选择往左半部分还是右半部分查找。

知道了这些,其他的部分就比较容易处理了,跟标准的二分查找没有太大区别,代码如下。

代码1

class Solution {public:    int search(vector<int>& nums, int target) {        if (nums.empty()) return -1;        int lo = 0, hi = nums.size() - 1;        while (lo <= hi) {            int mi = lo + (hi - lo) / 2;            if (nums[mi] == target) return mi;            else if (nums[mi] <= nums[hi] && nums[hi] < nums[lo]) {                if (nums[mi] < target && target <= nums[hi])                    lo = mi + 1;                else hi = mi - 1;            }             else if (nums[lo] <= nums[mi] && nums[hi] < nums[lo]) {                if (nums[lo] <= target && target < nums[mi])                    hi = mi - 1;                else lo = mi + 1;            }             else {                if (target < nums[mi]) hi = mi - 1;                else lo = mi + 1;            }        }        return -1;    }};

分析2

对于上面的代码,考虑到第一种可能性整体有序,即可以看成是左边有序也可以看成是右边有序,因此我们可以将类别分成两种
1. 右边有序 对应 nums[mi]<nums[hi] ;
2. 左边有序 对应 nums[mi]>nums[hi] ;
于是代码可以变得简单一点。

代码2

class Solution {public:    int search(vector<int>& nums, int target) {        if (nums.empty()) return -1;        int lo = 0, hi = nums.size() - 1;        while (lo <= hi) {            int mi = lo + (hi - lo) / 2;            if (nums[mi] == target) return mi;            else if (nums[mi] < nums[hi]) {                if (nums[mi] < target && target <= nums[hi])                    lo = mi + 1;                else hi = mi - 1;            }             else {                if (nums[lo] <= target && target < nums[mi])                    hi = mi - 1;                else lo = mi + 1;            }        }        return -1;    }};

相关题目

Find Minimum in Rotated Sorted Array
Search in Rotated Sorted Array II

0 0