标签:target ack 区间 技术 const tco 数组 solution 排序
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别
class Solution { public: //找到旋转点 int findC(const vector<int>& nums) { int a = 0, b = nums.size() - 1; int mid = (a + b) / 2; while (a != mid) { if (nums[mid] >= nums[0]) a = mid; else b = mid; mid = (a + b) / 2; } return a; } int search(vector<int>& nums, int target) { if (nums.size() == 0) return -1; if (nums.size() == 1) { if (target == nums.front())return 0; else return - 1; } int a, b; if (nums[0] >= nums.back()) {//有旋转 int C = findC(nums); if (target >= nums[0] && target <= nums[C]) { a = 0, b = C; } else if (target >= nums[C + 1] && target <= nums.back()) { a = C + 1, b = nums.size() - 1; } else return -1; } else {//没有旋转 if (target >= nums[0] && target <= nums.back()) a = 0, b = nums.size()-1; else return -1; } int mid = (a + b) / 2; if (nums[mid] == target) return mid; if (nums[mid + 1] == target) return mid + 1; while (a != mid) { if (nums[mid] > target) b = mid; else a = mid; mid = (a + b) / 2; if (nums[mid] == target) return mid; if (nums[mid + 1] == target) return mid + 1; } return -1; } };
标签:target ack 区间 技术 const tco 数组 solution 排序
原文地址:https://www.cnblogs.com/airfy/p/12791640.html