[1]力扣每日一题

2020.4.27搜索旋转排序数组

题目呈现如下:

题干
题目传送门

思路介绍:

  • 首先,题目要求复杂度在(O(log_{2}n))一下,可以预见必定要利用搜索旋转排序数组部分有序的特点,采用基于二分检索的检索方法.
  • 接下来主要的难题在于如何在搜索的某个状态,确定往前走还是往后走.实质上我们考虑的并不是左边界和有边界,我们的关注点只在--mid,亦即二分搜索每次拿来与Key对比的元素.边界的往哪个方向缩是很顺其自然的事情.我们可以列举一下可能出现的所有情况,然后据此确定往哪里缩.
    形象化的思路如图:
    流程图

下附AC代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(!nums.size()) return -1; // 注意,没有标程里面默认非空的条件
        int l = 0, r = nums.size()-1; // 左边界和右边界
        while (l < r) {
            int mid = (l + r)/2;
            if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid])) // 这个参照题解而来,和上述思路大差不差,其亦或优化实在惊艳
            else
                r = mid;
        }
        return nums[r] == target ? r : -1; // 这地方是r=l的,r和l都可以
    }
};
原文地址:https://www.cnblogs.com/tsuipo/p/12791487.html