33. 搜索旋转排序数组

题目:

思路:

【1】限制了时间复杂度那么便说明了必须要用二分来进行查找

代码展示:

//时间0 ms 击败 100%
//内存40 MB 击败 54.18%
//时间复杂度: O(log⁡n),其中 n 为 nums 数组的大小。
//整个算法时间复杂度即为二分查找的时间复杂度 O(log⁡n)。
//空间复杂度: O(1) 。我们只需要常数级别的空间存放变量。
class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        // 对特殊情况的处理
        if (n == 0) return -1;
        if (n == 1) return nums[0] == target ? 0 : -1;

        // 二分法进行查找
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            //如果刚好命中则返回
            if (nums[mid] == target) {
                return mid;
            }
            // 如果 第一位比mid小,说明是升序(最大值在mid右边)
            if (nums[0] <= nums[mid]) {
                if (nums[0] <= target && target < nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {
                // 反之 说明是存在两个升序(最大值在mid左边)
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return -1;
    }
}

 

posted @ 2023-07-21 12:29  忧愁的chafry  阅读(3)  评论(0编辑  收藏  举报