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——搜索旋转排序数组的更多相关文章
- Java实现 LeetCode 33 搜索旋转排序数组
33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ...
- 力扣Leetcode 33. 搜索旋转排序数组
33. 搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值, ...
- [leetcode] 33. 搜索旋转排序数组(Java)
33. 搜索旋转排序数组 说实话这题我连题都没有看懂....真是醉了 二分,没意思,直接交了- - https://www.jiuzhang.com/solutions/search-in-rotat ...
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...
- LeetCode 33 - 搜索旋转排序数组 - [二分]
假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...
- LeetCode 33 搜索旋转排序数组
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个 ...
- [LeetCode]33. 搜索旋转排序数组(二分)
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目 ...
- leetcode 33搜索旋转排序数组
暴力解法:O(n) 想办法用二分查找Ologn
- LeetCode 81——搜索旋转排序数组 II
1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1], ...
随机推荐
- autofac 注册
1 注册的概念和方式 使用autofac 的ContainerBuilder 来注册组件(components---通常指实现类),并把它的服务(service---通常指接口,抽象类,类实例)暴露给 ...
- Page 由于代码已经过优化或者本机框架位于调用堆栈之上
Page.Response.Clear(); Page.Response.Write("<script type=\"text/javascript\& ...
- SpringBoot非官方教程 | 第四篇:SpringBoot 整合JPA
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot4-jpaJ/ 本文出自方志朋的博客 JPA全称J ...
- Viewpager实现今日头条顶部导航的功能
利用简单的Textview 和Viewpager实现滑动.点击换页的效果,效果图如下: 先上布局文件代码: <?xml version="1.0" encoding=&quo ...
- chromium之ThreadLocalStorage
看看头文件怎么用 // Wrapper for thread local storage. This class doesn't do much except provide // an API fo ...
- Co. - Microsoft - Windows - Tomcat、JDK、MySQL通过 Inno 集成为exe部署包
需求 客户设备为Windows系统,需要部署公司产品,因此将Tomcat.JDK.MySQL.Java.war 打包整合成exe文件,Windows下一键部署安装. 最佳实践 1.下载免安装的mysq ...
- 实现php Curl 调用不同项目中方法
之前为了实现跨项目调用方法,遇到的一些问题和解决方法总结. 话不多说,直接复制代码先跑了再说! jq代码. $.ajax({ type: "post", dataType: &qu ...
- Sencha Visual Studio(IDE插件)
Sencha Visual Studio(IDE插件) 首先从官网上下载Visual Studio插件,注意不是VSCode编辑器,下载完后安装打开Visual Studio提示你去注册,输入你的se ...
- mysql计算排名
mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差 ...
- Python学习 :深浅拷贝
深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...