搜索旋转排序数组

题目链接:33. 搜索旋转排序数组 - 力扣(LeetCode)

 

 

 

 

 

 

 

 

 

 

解析:

先二分找k

然后两边分别lowerbound就好了

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        if (nums[0] <= nums[n - 1]) {
            auto it = std::lower_bound(nums.begin(), nums.end(), target);
            if (it == nums.end() || *it > target) return -1;
            return it - nums.begin();
        } else {
            int k;
            int l = 0, r = n - 1;
            while(l <= r) {
                int mid = (l + r) / 2;
                if (nums[mid] < nums[0]) r = mid - 1;
                else if (nums[mid] >= nums[0] && nums[mid] > nums[mid + 1]) {
                    k = mid;
                    break;
                } else {
                    l = mid + 1;
                }
            }
            if (target > nums[k]) return -1;
            auto k_end = nums.begin() + k + 1;
            auto it = std::lower_bound(nums.begin(), nums.begin() + k + 1, target);
            if (*it == target) return it - nums.begin();
            if (*it > target && (it - nums.begin() > 0)) return -1;
            it = std::lower_bound(nums.begin() + k + 1, nums.end(), target);
            if (it == nums.end() || *it > target) return -1;
            return it - nums.begin();
        }

    }
};

 

posted @ 2025-08-05 22:49  WTSRUVF  阅读(4)  评论(0)    收藏  举报