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

二分查找_ x 的平方根搜索插入位置山脉数组的峰顶索引

 x 的平方根 

在0~X中肯定有数的平方大于X,这是肯定的。我们需要从中找出一个数的平方最接近X且不大于X。0~X递增,它们的平方也是递增的,这样我们就可以用二分查找。

我们找出的数的平方是<或者恰好==X,所以把0~X的平方分为<=X >X的两部分,求<=区间的最右端

class Solution {
public:int mySqrt(int x) {long long left=0,right=x;while(left<right){long long mid=left+(right-left+1)/2;if(mid*mid<=x) left=mid;else right=mid-1;}return left;}
};

long long防止超出int范围

搜索插入位置

递增数组,找到相等返回下标,反正按顺序插入(恰好比target大的值),也就是目标值>=target。把区间分为<target >=target,找右区间左端

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left=0,right=nums.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[mid]<target) left=mid+1;else right=mid;}if(nums[left]<target) left++;//left恰好是数组最后一个元素return left;}
};

山脉数组的峰顶索引

这段数组可以分成两部分,前一部分递增 后一部分递减。

这样我们就可以用二分查找,如果mid处于递增位置,那么目标值肯定在右边。反之,左边。

下面有两种做法,不同点在于把峰值看做是递增数组上还是递减数组上,在递增数组就是求右端点,在递减数组就是求左端点。

峰值属于递减数组,求左端点

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left=0,right=arr.size()-1;while(left<right){int mid=left+(right-left)/2;if(arr[mid]>=arr[mid+1]) right=mid;else left=mid+1;}return left;}
};

因为mid可能正好是目标值,不能跟后面的值比较,后面是递增数组的。

峰值属于递增数组,求右端点

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left=0,right=arr.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(arr[mid]>=arr[mid-1]) left=mid;else right=mid-1;}return left;}
};

寻找峰值

有三中情况一直递增 / 一直递减 \ 既有递增又有递减 /\/\/\/\

但无论那种情况,如果是递增那它的右边一定有峰值,如果递减它的左边一定有峰值。

class Solution {
public:int findPeakElement(vector<int>& nums) {int left=0,right=nums.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(nums[mid]>nums[mid-1]) left=mid;else right=mid-1;}return left;}
};

把峰值看作递增的部分,如果nums[mid]>nums[mid-1]说明递增,那么mid可能是峰值,所以left不能=mid+1,left=mid,让right从右边找过来。

http://www.lryc.cn/news/466818.html

相关文章:

  • 汽车建模用什么软件最好?汽车建模渲染建议!
  • 蘑菇分类识别数据集(猫脸码客 第222期)
  • 长短期记忆网络(Long Short-Term Memory,LSTM)
  • WHAT - 引入第三方组件或项目使用需要注意什么
  • 原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
  • WindTerm配置快捷键Ctrl+C和Ctrl+V
  • AOP学习
  • 【ubuntu18.04】ubuntu18.04升级cmake-3.29.8及还原系统自带cmake操作说明
  • 利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)
  • 算法——python实现堆排序
  • uniapp-components(封装组件)
  • avue-crud组件,输入框回车搜索问题
  • STM32F407ZGT6定时器相关测试
  • 群晖通过 Docker 安装 GitLab
  • 1.Node.js环境搭建(windows)
  • 链上相遇,节点之间的悸动与牵连
  • 一些简单的编程题(Java与C语言)
  • java计算机毕设课设—愤怒小鸟游戏(附源码、文章、相关截图、部署视频)
  • 【ARM】MDK-Flex服务管理软件使用说明
  • 【H2O2|全栈】WPS/Office系列有哪些好用的快捷方式?
  • 对比学习)
  • 第十六届蓝桥杯嵌入式真题
  • 音频转码常用命令
  • INNER JOIN、LEFT JOIN 和 RIGHT JOIN有什么区别?什么是自连接?
  • 原型模式具体和直接调用构造函数创建实例的区别
  • MySQL 数据备份与恢复指南
  • NGINX 保护 Web 应用安全之基于 IP 地址的访问
  • 数据结构——顺序表的基本操作
  • 智能去毛刺:2D视觉引导机器人如何重塑制造业未来
  • 计算机系统的层次