【Leetcode】Search in Rotated Sorted Array

题目:给定一旋转数组和一整数,判断整数是否在该数组中。旋转数组的定义就是,把数组开始部分的若干个元素移到数组最后。此题假设数组中没有重复元素。

思路:之前写的判断情况特别复杂,然后还出错。看了网上题解,这样想就可以了:通过判断mid元素的大小,得知是mid左边的序列有序还是右边的序列有序。每次将target元素和有序的序列首尾元素比较,若在该有序序列中,则移动相应指针使得在该序列中查找;否则,target元素在另一序列中,移动相应指针。

需要注意的是,不管你用左闭右开区间,还是闭区间,你需要维护这个特性。在使用左闭右开区间时,取尾元素时记得-1,为nums[last-1]。

相关:剑指offer中有类似的一题,是求旋转数组的最小值。两者思路不是很一样。求最小值时,是维护两个指针P1和P2,P1始终指向第一个递增序列,P2始终指向第二个递增序列,通过mid元素与首尾元素比较,移动P1或P2指针。最终P1和P2相邻时,P2即指向最小值。等等。。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int first=0;
        int last=nums.size();
        while(first<last)
        {
            int mid=first+(last-first)/2;
            
            if(nums[mid]==target) return mid;
            
            if(nums[first]<nums[mid])
            {//左边有序
                if(nums[first]<=target && target<=nums[mid])
                    last=mid;
                else
                    first=mid+1;
            }
            else
            {//右边有序
                if(nums[mid]<=target && target<=nums[last-1])//既然是左闭右开区间,这里就应该是last-1
                    first=mid+1;
                else
                    last=mid;
            }
        }
        return -1;
    }
};

 

posted @ 2015-07-30 00:38  不系之舟530  阅读(154)  评论(0编辑  收藏  举报