当前位置: 首页 > news >正文

leetcode每日一题31

搜索旋转排序数组

那……二分法呗
数组中的数可以相同

比 33. 搜索旋转排序数组 多了一个「有重复元素」,导致无法根据 num >= nums[0] 来判断 num 在哪一半,比如
[1,1,1,1,1,2,1,1,1] 旋转数组两头相等,元素 1 可能在左半边可能在右半边
解决方法也很简单,只要把「旋转数组两头相等」这种特殊情况排除掉就行了

排除掉旋转数组两头相等的情况后,再像33一样判断从哪分
因为只旋转了一次,所以数组分为两段,两端分别是排序数组,那么mid一定会落入其中一种排序好的数列里
如果mid比start大,那么前一半是排序数组,如果mid比end小,那么后一半是排序数组
二分法的难点是代码的细节
以下引用自大佬的题解

第一类 1 0 1 1 1这种。此种情况下 nums[start] == nums[mid],分不清到底是前面有序还是后面有序,此时 start++ 即可。相当于去掉一个重复的干扰项。
第二类 2 3 4 5 6 7 1这种,也就是 nums[start] < nums[mid]。此例子中就是 2 < 5; 这种情况下,前半部分有序。因此如果 nums[start] <=target<nums[mid],则在前半部分找,否则去后半部分找。
第三类 6 7 1 2 3 4 5这种,也就是 nums[start] > nums[mid]。此例子中就是 6 > 2; 这种情况下,后半部分有序。因此如果 nums[mid] <target<=nums[end]。则在后半部分找,否则去前半部分找。

class Solution {
public:bool search(vector<int>& nums, int target) {int start=0;int end=nums.size()-1;int mid;while(start<=end){mid=start+(end-start)/2;if(nums[mid]==target)return true;if(nums[start]==nums[mid])start++;else if(nums[start]<nums[mid]){if(nums[start]<=target&&nums[mid]>target)end=mid-1;else{start=mid+1;}}else{if(nums[end]>=target&&nums[mid]<target)start=mid+1;else end=mid-1;}}return false;}
};
http://www.lryc.cn/news/237665.html

相关文章:

  • 使用Pytorch测试cuda设备的性能(单卡或多卡并行)
  • SpringBoot-AOP-基础到进阶
  • Midjourney绘画提示词Prompt参考学习教程
  • 美国费米实验室SQMS启动“量子车库”计划!30+顶尖机构积极参与
  • DCDC同步降压控制器SCT82A30\SCT82630
  • 本地/笔记本/纯 cpu 部署、使用类 gpt 大模型
  • 企企通亮相广东智能装备产业发展大会:以数字化采购促进智能装备产业集群高质量发展
  • pycharm安装教程
  • LeetCode【76】最小覆盖子串
  • 光谱图像超分辨率综述
  • Ubuntu apt-get换源
  • 磐舟CI-Web前端项目
  • Flink 运行架构和核心概念
  • 中间件安全:Apache Tomcat 文件上传.(CVE-2017-12615)
  • Linux 命令补充
  • HTTP常见面试题(小林coding版总结)
  • 一整个分析模型库,大数据分析工具都这么玩了吗?
  • 最新企业服务总线ESB的国内主要厂商和开源厂商排名,方案书价格多少
  • react重要知识点(面经)
  • 面试题-6
  • 九宫格 图片 自定义 路径
  • Leetcode经典题目之“双指针交换元素“类题目
  • 计算机基础知识54
  • 深度系统(Deepin)开机无法登录,提示等待一千五百分钟
  • 工具及方法 - 多邻国: Duolingo
  • Redis篇---第十一篇
  • linux CentOS7 安装git 配置秘钥公钥克隆代码
  • 深度学习之生成唐诗案例(Pytorch版)
  • 算法设计与分析算法实现——删数问题
  • 基于Vue+SpringBoot的超市账单管理系统 开源项目