p118 旋转有序数组的搜索(leetcode 33)

一:解题思路

这个题目是二分搜索的一道变形题目。比较关键的一点是,需要判断mid是落在左边的子数组上,还是落在右边的子数组上。

Time:O(log(n)),Space:O(1)

二:完整代码示例 (C++版和Java版)

C++:

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

        return -1;
    }
};

Java:

class Solution {
        public int search(int[] nums, int target)
        {
               int low=0,high=nums.length-1;
               while (low<=high)
               {
                   int mid=low+(high-low)/2;
                   if(nums[mid]==target) return mid;
                   else if(nums[mid]>=nums[low])
                   {
                       if(target<nums[mid] && target>=nums[low]) high=mid-1;
                       else low=mid+1;
                   }
                   else
                   {
                       if(target>nums[mid] && target<=nums[high]) low=mid+1;
                       else high=mid-1;
                   }
               }

               return -1;
        }
    }

 

posted @ 2020-04-13 15:55  repinkply  阅读(159)  评论(0)    收藏  举报