33. 搜索旋转排序数组
题目:
思路:
【1】限制了时间复杂度那么便说明了必须要用二分来进行查找
代码展示:
//时间0 ms 击败 100% //内存40 MB 击败 54.18% //时间复杂度: O(logn),其中 n 为 nums 数组的大小。 //整个算法时间复杂度即为二分查找的时间复杂度 O(logn)。 //空间复杂度: 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; } }