81. Search in Rotated Sorted Array II

来源:互联网 发布:windows arm模拟器 编辑:程序博客网 时间:2024/04/29 11:17

假设某个按照升序排序的数组在某个元素前旋转(例如:0 1 2 4 5 6 7 =>4 5 6 7 0 1 2)。给定一个目标值,判断该数组是否包含这个元素,如果包含返回对应TRUE,否则返回FALSE。可以存在重复元素

解题思路:
此题与第33题基本相似,但可以存在重复元素。所以第一思路就是按照33题的思路进行二分查找。由于存在重复元素,可能导致无法判断哪一侧是有序数据,需要在判断之间去除重复元素:

while (nums[m] == nums[mid] && nums[n] == nums[mid]){    m++;    n--;}

利用循环找到两边第一次出现不与中间元素重复 的位置,然后进行判断。

实现:

bool search(vector<int>& nums, int target) {    int n = nums.size() - 1;    int m = 0;    int mid = 0;    while (m <= n)    {        mid = (m + n) / 2;        if (nums[mid] == target)        {            return true;        }        while (nums[m] == nums[mid] && nums[n] == nums[mid])        {            m ++;            n --;        }        if (nums[m] <= nums[mid])        {            if (nums[m] <= target && nums[mid] > target)            {                n = mid - 1;            }            else            {                m = mid + 1;            }        }        else        {            if (nums[mid] < target && nums[n] >= target)            {                m = mid + 1;            }            else            {                n = mid - 1;            }        }    }    return false;}