码迷,mamicode.com
首页 > 其他好文 > 详细

33. Search in Rotated Sorted Array

时间:2016-05-08 21:14:23      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

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.

夹着一个有序数组在未知的某点上旋转过了。

(例如 0 1 2 3 4 5 6 7 可能变成 4 5 6 7 0 1 2)

在数组中查找一个特定值。如果找到返回下标,否则返回-1。

假设不存在数组里没有重复的元素。

对于有序数组可以采用二分法,对于旋转过的有序数组也可以使用二分法。只不过这时候数组会分割成两段,且前一段大于后一段。令A为数组,要查找的值为T,I为起始点,J为终点,M为中点,当M在前半段,即A[M]≥A[i]时,那么如果A[i] ≤t≤A[M]则继续在前半段查找,否则在后半段查找;当M在后半段,即A[M]<A[i],那么如果A[M]≤t≤A[J]则继续在后半段查找,否则在前半段查找。时间复杂度是O(logN),N为数组的长度。给出代码如下:

int search(vector<int>& nums, int target) {
    int i = 0;
    int j = nums.size()-1;
    while (i<=j)
    {
        int mid = i + (j-i)/2;
        int nmid = nums[mid];
        if (target == nmid)
            return mid;
            
        if (nums[i] <= nums[j])
        {
            if (target < nmid)
                j = mid-1;
            else i = mid+1;
        }
        else
        {
            if (nmid >= nums[i])
            {
                if (target >= nums[i] && target < nmid)
                    j = mid-1;
                else i = mid+1;
            }
            else
            {
                if (target > nmid && target <= nums[j])
                    i = mid+1;
                else j = mid-1;
            }
        }
    }
    
    return -1;
}

对于81. Search in Rotated Sorted Array II,允许数组中有重复值,只要在这个算法做微小的改动,使得右半段小于左半段即可,右半段可能等于左半段的只有最后一段,所以只要删除那些等于开头的末尾即可,注意要至少保留一个元素。

33. Search in Rotated Sorted Array

标签:

原文地址:http://www.cnblogs.com/zhiguoxu/p/5471567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!