LeetCode 33——搜索旋转排序数组
1. 题目
2. 解答
2.1. 方法一
直接进行二分查找,在判断查找方向的时候详细分类。
当 nums[mid] < target 时,
- 若 nums[left] <= nums[mid],此时,target 一定在nums[mid] 右边,继续向右查找。
- 若 nums[left] > nums[mid] < nums[right],此时 nums[mid] 两边都有较大的元素,我们要进一步确定查找的方向。
- 若 target <= nums[right],则向右查找。
- 若 target >= nums[left],则向左查找。
- 若 nums[right] < target < nums[left],则不存在。
当 nums[mid] > target 时,
- 若 nums[mid] <= nums[right],此时,target 一定在nums[mid] 左边,继续向左查找。
- 若 nums[left] <= nums[mid] > nums[right],此时 nums[mid] 两边都有较小的元素,我们要进一步确定查找的方向。
- 若 target <= nums[right],则向右查找。
- 若 target >= nums[left],则向左查找。
- 若 nums[right] < target < nums[left],则不存在。
class Solution {public:int search(vector<int>& nums, int target) {if (nums.size() == 0) return -1; // 数组为空int left = 0;int right = nums.size() - 1;int mid = 0;while(left <= right){mid = left + (right - left) / 2;if (nums[mid] == target){return mid;}else if (nums[mid] < target){if (nums[left] <= nums[mid]) // l <= m < r{left = mid + 1;}else if (nums[left] > nums[mid] && nums[mid] < nums[right]){if (nums[left] <= target){right = mid - 1;}else if (nums[right] >= target){left = mid + 1;}else{return -1;}} }else{if (nums[mid] <= nums[right]) // = 是只有一个元素的情况{right = mid - 1;}else if (nums[left] <= nums[mid] && nums[mid] > nums[right]) // = 是因为 mid 等于 left 的情况{if (nums[left] <= target){right = mid - 1;}else if (nums[right] >= target){left = mid + 1;}else{return -1;}} }}return -1;复制代码
2.2. 方法二
先利用二分查找确定转折点,然后对转折点两侧的数据分别再进行二分查找。
当 nums[mid] > nums[right] 时,说明 nums[mid] 在转折点左侧,继续向右查找。
当 nums[mid] < nums[right] 时,向左缩小区间,直到 left = right 时,此时 right 即为转折点的位置。
class Solution {public:int Binary_Search(vector<int>& nums, int left, int right, int target) {int mid = 0;while(left <= right){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; }int search(vector<int>& nums, int target) {if (nums.size() == 0) return -1; // 数组为空int left = 0;int right = nums.size() - 1;int mid = 0;while(left < right){mid = left + (right - left) / 2;if (nums[mid] > nums[right]){left = mid + 1;}else{right = mid;}}int a = Binary_Search(nums, 0, right-1, target);int b = Binary_Search(nums, right, nums.size() - 1, target);return a > b ? a : b;}
};复制代码
2.3. 方法三
nums[mid] 要么落在左边升序的数据区间内,要么落在右边升序的数据区间内。
当 nums[mid] 在右边升序的数据区间内
- 若 nums[mid] < target <= nums[right],则向右查找;否则向左查找。
当 nums[mid] 在左边升序的数据区间内
- 若 nums[left] <= target < nums[mid],则向左查找;否则向右查找。
class Solution {public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;int mid = 0;while(left <= right){mid = left + (right - left) / 2;if (nums[mid] == target){return mid;}else if (nums[mid] < nums[right]) // nums[mid] 在右边升序的数据区间内 {if (nums[mid] < target && target <= nums[right]) left = mid + 1;else right = mid - 1;}else // nums[mid] 在左边升序的数据区间内 {if (nums[left] <= target && target < nums[mid]) right = mid - 1;else left = mid + 1;}}return -1;}
};复制代码
获取更多精彩,请关注「seniusen」!
LeetCode 33——搜索旋转排序数组相关推荐
- LeetCode—33. 搜索旋转排序数组
33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...
- LeetCode 33. 搜索旋转排序数组 golang
33. 搜索旋转排序数组 三个测试用例, 这个题的难度是二分法的左侧条件很难写出来. 4 5 6 0 1 2 3 1 2 3 4 5 6 0 5 1 2 3 4 ( 例如,数组 [0,1,2,4,5, ...
- leetcode —— 33. 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- leetcode 33 搜索旋转排序数组 到处是细节的好题
这个题想了想就会做,只是细节真的能卡死人,找了好久的bug.甚至我怀疑我现在的代码可能还有错,只是没例子测出来. 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...
- LeetCode 33. 搜索旋转排序数组(二分查找)
1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...
- Leetcode 33.搜索旋转排序数组 (每日一题 20210707)
整数数组 nums 按升序排列,数组中的值 互不相同 .在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [num ...
- Dichotomy专栏:Leetcode:#33 搜索旋转排序数组
Question: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ...
- leetCode:33. 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nu ...
- LeetCode 33 搜索旋转排序数组
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 解决方案 class Solution {public int sea ...
- LeetCode 33. 搜索旋转排序数组
最新文章
- c 找文件服务器文件,Linux C/C++项目:虚拟文件服务器(功能匹配百度网盘)
- shell编程之特殊变量
- MySQL 基础————常用数据类型
- shiro 方法级别细粒度权限控制_Shiro的认证和权限控制
- 给网站文字添加图标-Font Awesome
- C#设计模式之23-访问者模式
- 配置备份DHCP服务器(LINUX)
- numpy二维数组改变某些数_机器学习:Python常用库——Numpy库
- 无法启动此程序,因为计算机中丢失iathook.dll,通过IAT+Hook调试Windows自定义未处理异常过滤器.pdf...
- c语言程序设计 cap 翁恺,GPS数据处理 翁恺老师C语言程序设计CAP第10章编程题
- 3.0-rsync格式
- 基于SpringBoot+Mybatis+Thymeleaf的信息管理系统
- 提取 Wallpaper Engine 的 pkg 壁纸文件,获得静态壁纸
- 友盟第三方分享 QQ QQ空间 微信 新浪 及走过的坑
- 【转贴】龙芯生态产品和解决方案巡展(第四篇)——存储
- (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】
- .NET Core ConfigureServices与Configure
- Unity 3D游戏开发 - U3D入门 | 3D 模型重用之预制体
- python什么意思g_在外行人看来,Python字符串格式“g”实际意味着什么?
- ‘dict_keys‘ object does not support indexing错误解决
热门文章
- apache和nginx那点事儿--阻塞和异步
- 使用ES6的Promis完美解决ajax的回调(优化代码)
- 【2017-3-17】视图,事务,备份还原,分离附加
- webpack和webpack-dev-server安装配置(遇到各种问题的解决方法)
- 【JZOJ4743】【NOIP2016提高A组模拟9.2】积木
- PInvoke在 2.0 3.0的时候正常 升级到4.0后出错。
- 触发器 索引视图 游标 事务
- Bone Collector(hdoj--2602--01背包)
- Confluence 6 数据库表-杂项(Miscellaneous)
- PHP中strtotime()的使用