题目描述

题目分析

不含重复元素的题解(leetcode33)

这道题也是我们算法课的一道编程题,写完以后发现当时的思路和现在没有什么变化,果然是自己啊。我的想法是先判断区间整体是升序的还是旋转的,如果是升序的就按照正常的二分查找,如果是旋转的就判断中轴的落在了左半升区间还是右半升区间,问题的关键在于,旋转的数组不能简单因为target和中轴的大小判断是在左区间还是右区间,因此要分类讨论一下。总之,这个思路不是很好,因为没有有效利用端点的信息,如同官方题解所说,我们是可以直接判断出target在哪个区间的。每一次中轴会将数组分成两个部分,至少有一个部分是升序的,我们能够很简单的判断出target是否在那个升序数组中,从而决定在哪个半区间中查找。

我的思路代码

class Solution {public:int search(vector<int>& nums, int target) {return bsearch(nums, target, 0, nums.size());}
private:int bsearch(vector<int>& nums, int target, int l, int r) {if (l == r) return -1;int mid = (l + r) >> 1;if (nums[mid] == target) return mid;if (nums[l] <= nums[r - 1]) {//升序区间if (nums[mid] > target) return bsearch(nums, target, l, mid);else return bsearch(nums, target, mid + 1, r);} else {//旋转区间if (nums[mid] >= nums[l]) {//中心点落在左边升序区间if (nums[mid] < target) return bsearch(nums, target, mid + 1, r);else {int lr = bsearch(nums, target, l, mid);int rr = bsearch(nums, target, mid + 1, r);if (lr == -1) {if (rr == -1) return -1; else return rr;} else return lr;}} else {//中心点落在右边升序区间if (nums[mid] > target) return bsearch(nums, target, l ,mid);else {int lr = bsearch(nums, target, l, mid);int rr = bsearch(nums, target, mid + 1, r);if (lr == -1) {if (rr == -1) return -1; else return rr;} else return lr;}}}}
};

按照官方题解写的代码

class Solution {public:int search(vector<int>& nums, int target) {int l = 0, r = nums.size(), mid;while (l < r) {mid = (l + r) >> 1;if (nums[mid] == target) return mid;if (nums[mid] >= nums[l]) {//左半区间是升序if (target >= nums[l] && target < nums[mid]) r = mid;else l = mid + 1;} else {//右半区间是升序if (target > nums[mid] && target <= nums[r - 1]) l = mid + 1;else r = mid;}}return -1;}
};

刚才看了一下题解,发现它总是和nums[0]nums[n-1]比较,厉害。

含重复元素的题解

每日一题:leetcode81.搜索旋转排序数组Ⅱ相关推荐

  1. LeetCode高频题33. 搜索旋转排序数组

    LeetCode高频题33. 搜索旋转排序数组 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批A ...

  2. LeetCode--81. 搜索旋转排序数组Ⅱ(遍历法,二分法)

    搜索旋转排序数组Ⅱ(C, Python) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 遍历法 3.2 二分法 4. Python语言实现 1. 题目描述 难度:中等 2. 题目分析 这道 ...

  3. 【LintCode 题解】小米面试算法题:搜索旋转排序数组

    题目描述 假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2).给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回 ...

  4. Leetcode刷题 33.搜索旋转排序数组

    分析: 首先看到这题的第一印象是题目很长,感觉很复杂,但仔细看下来之后发现题目中间一段对解题没有任何的帮助,重点在最后一句,大概意思就是在目标数组中找到目标数据,并传出对应位置,否则传出-1 清楚了目 ...

  5. leetcode刷题:搜索旋转排序数组

    题目: 分析:当我们将数组旋转的时候,就无法再保证数组是完全有序的了,但是我们可以判断出那块是有序的.然后在进行比较和查找 如下代码: class Solution { public:int sear ...

  6. LeetCode81. 搜索旋转排序数组 II(二分查找)

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...

  7. Leetcode刷题33. 搜索旋转排序数组

    升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] ). 请你在数组中搜索 target ,如果数组 ...

  8. LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  9. 《LeetCode力扣练习》第33题 搜索旋转排序数组 Java

    <LeetCode力扣练习>第33题 搜索旋转排序数组 Java 一.资源 题目: 整数数组 nums 按升序排列,数组中的值 互不相同 . 在传递给函数之前,nums 在预先未知的某个下 ...

最新文章

  1. 第04章—整合Mybatis
  2. 【小结】除了网络搜索(NAS),AutoML对深度学习模型优化还有哪些贡献?
  3. windows mobile C# net3.5 如何捕捉Arrow的CheckBox的KeyDown事件?
  4. 3.26日第六次作业,第10章质量,11章人力
  5. 最短路径问题 --- Dijkstra算法详解
  6. c#中消息机制阻塞实例与结论
  7. python mysql 数据类型_mysql学习:mysql数据类型有哪些?
  8. excel转PDF时,画图不分页
  9. NS,DNS和A记录 之间关系
  10. SMC在线气动制图软件PneuDraw
  11. java棋盘最短路径障碍物_(Eucledian最短路径)检测平面中障碍物的角落
  12. Linux下使用rm删除文件,并排除指定文件(亲测可行)
  13. 详解区块链(很详很长)
  14. 脚本小子_python数据类型代码
  15. 基因加性方差、显性方差与上位性方差定义
  16. 【转载】com.mysql.jdbc.Driver 与 org.gjt.mm.mysql.Driver的区别
  17. 农业农村部回应长江刀鱼将正式禁捕:已严重过度捕捞
  18. c++ notify_one()和notify_all()
  19. 本机配置nginx后css样式失效
  20. chatgpt赋能Python-python_hanning

热门文章

  1. CentOS 7 Flannel的安装与配置
  2. [基础]PeopleSoft中的作业和调度作业集合定义
  3. 【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)
  4. ORACLE连接数据库(备忘)
  5. 对c++primer 16.6.1的第4小节的代码说明
  6. 【转贴备忘】[教程]iPhone 實機開發 Part 1 - HelloWorld
  7. es安全组端口_从零开始在远程服务器(Linux)上搭建es,eshead和ik分词器
  8. c语言sqlist结构体,c语言里 sqlist
  9. centos 离线安装mysql_CentOS6离线安装mysql-5.7.25
  10. mysql sum很慢,可以在MySQL中加快sum()吗?