码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode 33. 搜索旋转排序数组

时间:2020-04-28 10:04:33      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:target   ack   区间   技术   const   tco   数组   solution   排序   

题目描述:

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [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. 搜索旋转排序数组

标签:target   ack   区间   技术   const   tco   数组   solution   排序   

原文地址:https://www.cnblogs.com/airfy/p/12791640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!