你有进一步深入理解二分查找吗?
int binarySearch(int target)
{int ret=-1;int len=arr.size();int left=0;int right=len-1;while(left<=right){int mid=(left+right)/2;if(target==arr[mid]){ret=mid;break;}else if(target<arr[mid]){right=mid-1;}else{left=mid+1;}}return ret;
}
看一个最简单的二分查找的例子:
还可以针对什么进行二分查找呢?
int findSummit(vector<int> arr)
{int len=arr.size();int left=0;int right=len-1;while(left<=right){int mid=(left+right)/2;int pre=arr[mid-1];int now=arr[mid];int aft=arr[mid+1];if(pre<now&&now>aft){return mid;}else if(pre<now&&now<aft){//峰值在右边left=mid+1;}else{//峰值在左边right=mid;}}return -1;
}
这里与简单二分查找略有不同的是峰值如果在左边right置为mid而不是mid-1,这是为了防止数组越界,大家可以思考一下为什么,本文主要介绍二分思想就不再过多介绍了。
/**
* // This is the MountainArray's API interface.
* // You should not implement it, or speculate about its implementation
* class MountainArray {
* public:
* int get(int index);
* int length();
* };
*/
class Solution {
public:int findInMountainArray(int target, MountainArray &mountainArr) {int len=mountainArr.length();int left=0;int right=len-1;int summit=-1;int mid=-1;while(left<=right){mid=(left+right)>>1;int pre=mountainArr.get(mid-1);int now=mountainArr.get(mid);int aft=mountainArr.get(mid+1);if(pre<now&&now>aft){summit=mid;break;}else if(pre<now&&now<aft){left=mid+1;}else{right=mid;}}left=0;right=summit;while(left<=right){mid=(left+right)>>1;int now=mountainArr.get(mid);if(target==now){return mid;}else if(target<now){right=mid-1;}else{left=mid+1;}}left=summit;right=len-1;while(left<=right){mid=(left+right)>>1;int now=mountainArr.get(mid);if(target==now){return mid;}else if(target>now){right=mid-1;}else{left=mid+1;}}return -1;}
};
class Solution {
public:vector<int> nums;int len;int rvalue;int left,right;int findSummit(){while(left<=right){int mid=(left+right)>>1;if((mid==0&&mid+1<len&&nums[mid]>nums[mid+1])||(mid-1>=0&&mid+1<len&&nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1])){return mid;}else if(nums[mid]<rvalue){right=mid-1;}else{left=mid+1;}}return -1;}int search(vector<int>& nums, int target) {this->nums=nums;len=nums.size();if(len==0){return -1;}//右半部分最大值rvalue=nums[len-1];left=0;right=len-1;int summit=findSummit();if(target>rvalue){//在左半部分left=0;right=summit;}else{//在右半部分left=summit+1;right=len-1;}while(left<=right){int mid=(left+right)>>1;if(target==nums[mid]){return mid;}else if(target<nums[mid]){right=mid-1;}else{left=mid+1;}}return -1;}
};
每个 Python 学习者都值得一试,快看!
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
热 文 推 荐
你有进一步深入理解二分查找吗?相关推荐
- 如何写出正确的二分查找?——利用循环不变式理解二分查找及其变体的正确性以及构造方式...
序言 本文以经典的二分查找为例,介绍如何使用循环不变式来理解算法并利用循环不变式在原始算法的基础上根据需要产生算法的变体.谨以本文献给在理解算法思路时没有头绪而又不甘心于死记硬背的人. 二分查找究竟有 ...
- 17道题带你理解二分查找
不太会的可以先看看二分查找的模板 点这里 最需要注意的是二分查找的分界线并不止局限于大于等于小于,而是对某种性质的一种分界 1.Leetcode704. 二分查找 class Solution {pu ...
- JAVA二分查找-探讨思维与代码的一致性
二分查找的实现,探讨探讨思维与代码的一致性 展示两段代码,这两段代码可能并没有差别,都是二分查找的实现. public class Main {public static void main(Stri ...
- d - 数据结构实验之查找四:二分查找_【数据结构】资料
春天来了,关注我们吧!! 数据结构资料 1.栈和队列的共同特点是( ). A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 答案:A 解析:栈的操作只允许在栈的一端 ...
- 【02】Java进阶:09-冒泡排序、选择排序、二分查找、异常、异常的产生和处理、自定义异常、多线程
day09[排序算法.异常.多线程基础] 今日内容 冒泡排序 选择排序 二分查找 异常处理 多线程基础 教学目标 能够理解冒泡排序的执行原理 能够理解选择排序的执行原理 能够理解二分查找的执行原理 能 ...
- 二分查找之第一个大于小于等于 target 的值
目录 欢迎浏览作者的[GitHub](https://github.com/loversgzl/Learning) 二分查找概述 1.查找某个值 target 2.查找第一个大于(大于等于) targ ...
- leetcode刷题笔记——二分查找
leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...
- 二分查找——部分题目汇总——长长文详细分享
文章目录 前言 二分查找 第一题:二分查找 解题思路 GIF 代码 第二题:搜索插入位置 解题思路 代码 第三题:寻找旋转排序数组中的最小值 解题思路 代码 第四题:寻找峰值 解题思路 代码 第五题: ...
- 【经典算法】:二分查找
前言 二分查找这种老生常谈的话题,说的很简单,但是仍然有些大伙不明白,所以这里希望自己能够写出一篇很浅显易懂的博客帮助大家理解 二分查找的规则 给定数组已经排序好,然后对其进行编号.这里我们默认是从小 ...
最新文章
- SVD在推荐系统中的应用详解以及算法推导
- php 基础函数写法,字符串,常用函数
- c++申请内存空间_有没有想过:malloc分配的内存空间地址连续吗
- GDCM:gdcm::Command的测试程序
- HDU 3333 Turing Tree(树状数组+离线处理+离散化)
- 101与金根回顾敏捷个人:(13)敏捷个人和敏捷开发
- 【计算机系统】指令流水线
- 服务器小白-MYSQL基础安装配置
- 智能优化算法:人工电场优化算法-附代码
- Spring boot 开发 GA/T1400 协议之注册、保活、注销、校时功能
- webmax函数高级教程整理集2
- 对接金蝶云星空审批流
- 眼科准分子激光治疗仪行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 无线桥接:没有网口解决nas有线组网问题
- 第10章 物理安全要求
- Android APK上架 应用宝 没有 固件版本 不显示
- pymysql.err.OperationalError: (1136, “Column count doesn‘t match value count at row 1“)报错反省。
- 【Windows】Windows软件商店无法正常安装软件
- Flutter开发的抖音国际版
- 无线网络 笔记本连接正常上网,手机之类的就不能上网
热门文章
- php session实现原理
- 在iOS平台使用libcurl
- [原]ASP.NET中使用JQUERY-EASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次...
- winform与数据库同步更新
- 运行github上的Vue项目
- 矩池云上安装yolov5并测试
- h5在微信自定义分享php,h5页面自定义微信分享
- 贪心----汽车加油问题
- redis笔记5 stream消息队列
- 第4章 旋转蛇(《C和C++游戏趣味编程》配套教学视频)