文章目录
- 题目介绍
- 题解
题目介绍
题解
首先用 153. 寻找旋转排序数组中的最小值 的方法,找到 nums 的最小值的下标 i。
然后分类讨论:
-
如果 target>nums[n−1],在 [0,i−1] 中二分查找 target。
-
如果 target≤nums[n−1],那么:
-
如果 i=0,说明 nums 是递增的,直接在 [0,n−1] 中二分查找 target。
-
如果 i>0,那么 target 一定在第二段 [i,n−1] 中,在 [i,n−1] 中二分查找 target。
这两种情况可以合并成:在 [i,n−1] 中二分查找 target。
-
class Solution {public int search(int[] nums, int target) {int n = nums.length, i = findMin(nums);if (target > nums[n - 1]) { // target 在第一段return lowerBound(nums, 0, i - 1, target); }// target 在第二段return lowerBound(nums, i, n - 1, target); }// 153. 寻找旋转排序数组中的最小值private int findMin(int[] nums) {int left = 0, right = nums.length - 2; // 闭区间 [0, nums.length - 2]while (left <= right) { int mid = left + (right - left) / 2;if (nums[mid] < nums[nums.length - 1]) {right = mid - 1; } else {left = mid + 1; }}return left;}// 有序数组中找 target 的下标private int lowerBound(int[] nums, int left, int right, int target) {while (left <= right) { int mid = left + (right - left) / 2;if (nums[mid] == target){return mid;}else if (nums[mid] < target) {left = mid + 1; } else {right = mid - 1; }}return -1;}
}```