leetcode挨个儿刷150515(10):Search in Rotated Sorted Array

来源:互联网 发布:瑞斯康微电子知乎 编辑:程序博客网 时间:2024/04/30 14:51

题目内容:

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.

说明:

1,这个题目是在数组中查找目标元素,最坏的时间复杂度都是O(n)的,最差就是从头到尾的查找一遍。这个也是可以通过的。

2,好一点的思路,因为是有序的数组,关键在于扭转点的发现。使用二叉查找的思路,复杂度是O(logn)。


注意:有序或基本有序的数组的查找问题,都应该想到二叉查找。

第一种思路的代码:(略傻)

class Solution {public:    int search(int A[], int n, int target) {        int i = 0;        for(; i < n; i++)        {            if( target == A[i] )            return i;        }        if(i==n)            return -1;        }};

第二种思路的代码:

class Solution {public:    int search(vector<int>& nums, int target) {         int size = nums.size();         if(size <= 0)            return size;        int left = 0;        int right = size - 1;        int middle = (left + right) / 2;        if(nums[middle] == target)            return middle;        else if(nums[middle] < nums[right])        {            if((target > nums[middle]) && (target <= nums[right]) )            {                return BinarySearch(nums,middle + 1,right,target);            }            else            {                return SearchRotate(nums,left,middle - 1,target);            }        }        else        {             if((target >= nums[left]) && (target < nums[middle]) )            {                return BinarySearch(nums,left,middle - 1,target);            }            else            {                return SearchRotate(nums,middle + 1,right,target);            }        }    }            int BinarySearch(vector<int>&  nums,int left,int right,int target)
<span style="font-family: Arial, Helvetica, sans-serif;">//在单调有序的数组中查找目标元素,二叉查找</span>    {        if(left > right)            return -1;        int middle = (left + right) / 2;        if(nums[middle] == target)            return middle;        else if(nums[middle] > target)        {            return BinarySearch(nums,left,middle - 1,target);        }        else        {            return BinarySearch(nums,middle + 1,right,target);        }            }        int SearchRotate(vector<int>&  nums,int left,int right,int target)  //在回旋数组中查找目标元素    {        if(left > right)            return -1;        int middle = (left + right) / 2;        if(nums[middle] == target)            return middle;        else if(nums[middle] < nums[right])        {            if((target > nums[middle]) && (target <= nums[right]) )            {                return BinarySearch(nums,middle + 1,right,target);            }            else            {                return SearchRotate(nums,left,middle - 1,target);            }        }        else        {             if((target >= nums[left]) && (target < nums[middle]) )            {                return BinarySearch(nums,left,middle - 1,target);            }            else            {                return SearchRotate(nums,middle + 1,right,target);            }        }            }    };



0 0
原创粉丝点击