搜索旋转排序数组
题目链接: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(); } } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号