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<int>& 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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容