LeetCode 33. 搜索旋转排序数组
Posted airfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 33. 搜索旋转排序数组相关的知识,希望对你有一定的参考价值。
题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别
题目明确要求我们的时间复杂度是$log(n)$,所以很显然是想让我们使用二分查找。
1.判断是否有旋转;
2,没有旋转,就直接使用二分查找;
3,有旋转,用二分查找找旋转点然后分成两个区间使用二分查找
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; } };
以上是关于LeetCode 33. 搜索旋转排序数组的主要内容,如果未能解决你的问题,请参考以下文章