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——搜索旋转排序数组相关推荐

  1. LeetCode—33. 搜索旋转排序数组

    33. 搜索旋转排序数组 题目描述:整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length ...

  2. 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, ...

  3. leetcode —— 33. 搜索旋转排序数组

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值, ...

  4. leetcode 33 搜索旋转排序数组 到处是细节的好题

    这个题想了想就会做,只是细节真的能卡死人,找了好久的bug.甚至我怀疑我现在的代码可能还有错,只是没例子测出来. 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  5. LeetCode 33. 搜索旋转排序数组(二分查找)

    1. 题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在 ...

  6. Leetcode 33.搜索旋转排序数组 (每日一题 20210707)

    整数数组 nums 按升序排列,数组中的值 互不相同 .在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [num ...

  7. Dichotomy专栏:Leetcode:#33 搜索旋转排序数组

    Question: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ...

  8. leetCode:33. 搜索旋转排序数组

    整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nu ...

  9. LeetCode 33 搜索旋转排序数组

    https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 解决方案 class Solution {public int sea ...

  10. LeetCode 33. 搜索旋转排序数组

最新文章

  1. c 找文件服务器文件,Linux C/C++项目:虚拟文件服务器(功能匹配百度网盘)
  2. shell编程之特殊变量
  3. MySQL 基础————常用数据类型
  4. shiro 方法级别细粒度权限控制_Shiro的认证和权限控制
  5. 给网站文字添加图标-Font Awesome
  6. C#设计模式之23-访问者模式
  7. 配置备份DHCP服务器(LINUX)
  8. numpy二维数组改变某些数_机器学习:Python常用库——Numpy库
  9. 无法启动此程序,因为计算机中丢失iathook.dll,通过IAT+Hook调试Windows自定义未处理异常过滤器.pdf...
  10. c语言程序设计 cap 翁恺,GPS数据处理 翁恺老师C语言程序设计CAP第10章编程题
  11. 3.0-rsync格式
  12. 基于SpringBoot+Mybatis+Thymeleaf的信息管理系统
  13. 提取 Wallpaper Engine 的 pkg 壁纸文件,获得静态壁纸
  14. 友盟第三方分享 QQ QQ空间 微信 新浪 及走过的坑
  15. 【转贴】龙芯生态产品和解决方案巡展(第四篇)——存储
  16. (大集合)Linux进程和线程的基本编程、通讯和例程【杂记】
  17. .NET Core ConfigureServices与Configure
  18. Unity 3D游戏开发 - U3D入门 | 3D 模型重用之预制体
  19. python什么意思g_在外行人看来,Python字符串格式“g”实际意味着什么?
  20. ‘dict_keys‘ object does not support indexing错误解决

热门文章

  1. apache和nginx那点事儿--阻塞和异步
  2. 使用ES6的Promis完美解决ajax的回调(优化代码)
  3. 【2017-3-17】视图,事务,备份还原,分离附加
  4. webpack和webpack-dev-server安装配置(遇到各种问题的解决方法)
  5. 【JZOJ4743】【NOIP2016提高A组模拟9.2】积木
  6. PInvoke在 2.0 3.0的时候正常 升级到4.0后出错。
  7. 触发器 索引视图 游标 事务
  8. Bone Collector(hdoj--2602--01背包)
  9. Confluence 6 数据库表-杂项(Miscellaneous)
  10. PHP中strtotime()的使用