LeetCode 33. 搜索旋转排序数组
33. 搜索旋转排序数组
题目
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
示例 1:
1 | 输入:nums = [4,5,6,7,0,1,2], target = 0 |
示例 2:
1 | 输入:nums = [4,5,6,7,0,1,2], target = 3 |
示例 3:
1 | 输入:nums = [1], target = 0 |
提示:
1 | 1 <= nums.length <= 5000 |
思路
这个题目是在153题:寻找旋转排序数组中的最小值的基础上,完成的,寻找最小的值,已经确定了target的目标,我们在二分的时候能够确定我们应该接下来选择哪一个。
现在是寻找target,所以我们在二分后需要判断target的目标的位置
- 如果数组为空返回-1,如果数据长度为1直接判断
- 定义left=0,right=num.length-1
- while(left<=right)
- 先判断mid的值是不是目标值,入股是直接返回
- 然后mid和right比较,如果right比较大,说明mid到right是升序
- 确定taget在mig和right之间(mid < target <= right),left = mid + 1
- 否则riht = mid - 1
- 如果right小
- 确定target在left和mid之间(left <= target <mid),right = mid -1
- 否则left = mid + 1
实现
1 | private static class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 吕小医's BLOG!