leetcode#33-Search in Rotated Sorted Array-搜索旋转排序数组

Search in Rotated Sorted Array

解题思路

首先注意题目要求,算法时间复杂度要求为:O(log n),那么很容易想到的算法就是二分查找,没错,这个题就是二分查找算法的变形。
二分查找算法过程描述大概如下(wiki):是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
而此题不同之处就在于,有序数组被进行过一次翻转,所以在搜索过程中,target在数组中区间范围的确定不能简单根据target与中间元素的大小比较来确定,确定大体流程如下:

约定:当前数组范围:[l,h]
mid = (l+h)/2 //中间元素索引下标
target区间计算

代码(c++)

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

你可能感兴趣的:(leetcode#33-Search in Rotated Sorted Array-搜索旋转排序数组)