改良的二分法-旋转数组

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.

旋转数组是分为两个有序数组,因此可以使用二分查找。
每次判断一段数组是否有序,再根据有序部分首尾两个数字和target的大小关系来判断target存在于哪一部分。有序则调用正常二分,找不到则对剩下一半数组调用此函数。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        int res = -1, left = 0, right = n - 1;
        
        while(left <= right)
        {
            int mid = (left + right) >> 1;
            if(target == nums[mid])
            {
                    res = mid;
                    break;
            }
            else if(nums[mid] < nums[right]) //后半部分有序
            {
                if(target > nums[mid] && target <= nums[right])
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            else //前半部分有序
            {
                if(target >= nums[left] && target < nums[mid])
                    right = mid - 1;
                else
                    left = mid + 1;
            }
        }    
        return res;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容