leetcode81. Search in Rotated Sorted Array

来源:互联网 发布:c语言32个关键字举例 编辑:程序博客网 时间:2024/05/18 02:52

medium题

题目:

Suppose an array sorted in ascending order 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,2,3,4,5,6,7  以5为轴翻转为6,7,1,2,3,4,5

在这个数组中查找给定元素。

可以用二分法来解

AC解

class Solution {public:    bool search(vector<int>& nums, int target)     {        int first = 0,v_size = nums.size();        int last = v_size;        if (last == 0)            return false;                    while (first < last)        {            int middle = first + (last - first) / 2;                        if (nums[middle] == target)                return true;                        if (nums[first] <= nums[middle])            {//说明first到middle是递增的                if (target >= nums[first]&&target < nums[middle])                    last = middle;                else first = middle + 1;            }            else             {                if (target > nums[middle]&&target <= nums[last - 1])                    first = middle + 1;//middle到last-1是递增的                else last = middle;            }        }                return false;    }};
升级版,允许有重复元素

则nums[first] <= nums[middle]不能说明first到middle是递增的,如1,3,1,1

需要细分

AC解

class Solution {public:    bool search(vector<int>& nums, int target)     {        int first = 0,v_size = nums.size();        int last = v_size;        if (last == 0)            return false;                    while (first < last)        {            int middle = first + (last - first) / 2;                        if (nums[middle] == target)                return true;                        if (nums[first] < nums[middle])            {                if (target >= nums[first]&&target < nums[middle])                    last = middle;                else first = middle + 1;            }            else if (nums[first] > nums[middle])            {                if (target > nums[middle]&&target <= nums[last - 1])                    first = middle + 1;                else last = middle;            }            else first++;        }                return false;    }};




0 0
原创粉丝点击