1389 蓝桥杯 二分查找数组元素 简单

1389 蓝桥杯 二分查找数组元素 简单

//C++风格解法1,lower_bound(),通过率100%
//利用二分查找的方法在有序的数组中查找,左闭右开
#include <bits/stdc++.h>
using namespace std;int main(){int data[200];for(int i = 0 ; i < 200 ; ++i) data[i] = 4 * i + 6;int tager; cin >> tager;    //输入目标值cout << lower_bound(data,data + 200,tager) - data;return 0;
}

在有序数组中进行二分查找,升序,查找第一个 >= target的元素,时间复杂度O(logn)
lower_bound(data,data + 200,tager)返回物理地址,减去首地址得到下标

// 升序数组中:
upper_bound(a.begin(), a.end(), x); // 查找第一个 > x的元素
lower_bound(a.begin(), a.end(), x); // 查找第一个 >= x的元素
// 降序数组中:
upper_bound(a.begin(), a.end(), x, greater<type>()); // 查找第一个 < x的元素
lower_bound(a.begin(), a.end(), x, greater<type>()); // 查找第一个 <= x的元素

排序的时候,默认是从小到大,但是第三个参数用greater会变成从大到小,而不需要cmp

upper_bound默认是找大于,但是第三个参数用greater就是找小于,lower_bound同理可得

//C风格解法2,逆推,虽然用了cin、cout,通过率100%
#include <iostream>
using namespace std;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int x;cin >> x;cout << (x - 6) / 4 << endl;return 0;
}
//C风格解法3,二分法左闭右开
#include <iostream>
using namespace std;int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int x;cin >> x;int data[200];for(int i = 0 ; i < 200 ; i ++)data[i] = 4 * i + 6;int left = 0,right = 200;   //定义target在左闭右开的区间里,即[left, right)//right指向最后一个元素的后一个元素while(left < right){    //如果一开始left = right,target在[left, right)区间上无意义int mid = left + ((right - left) >> 1);   //等同于 (left + right) / 2,防止溢出if(data[mid] >= x)right = mid;    //target在左区间[left, mid] else left = mid + 1;    //target在右区间[left, right) }    cout << left << endl;   //left = rightreturn 0;
}

基于此方法改动可能会超时,
如传统三段式if、else if、else,二分法左闭右闭,while(left <= right)等
right = left时,循环条件被修改成 while (left <= right) 会接着做循环
出错,如data[mid] > x,注意返回的不是mid
出错,声明mid,输出mid

如果是左闭右闭,left = 0,right = 199, while (left <= right)
定义了target在左闭右闭的区间内,[left, right],right指向最后一个元素
left = right时,target在区间[left, right]仍然有效
若循环条件修改为while (left < right),nums[middle] = A 时< target = B,
此时 left = mid + 1,left = right,而循环条件为while (left < right),
还未找到A 的情况下算法就跳出了循环

reference:

彻底记住 lower_bound 和 upper_bound 功能和用法_lower_bound和upper_bound的用法-CSDN博客

关于lower_bound( )和upper_bound( )的常见用法_lowerbound和upperbound-CSDN博客

lower_bound, upper_bound, greater, less 用法_lower_bound greater-CSDN博客

【二分查找】详细图解_二分查找法流程图-CSDN博客

图文并茂带你入门二分查找算法 - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode简单题记录

1、两数之和&#xff0c;给定数组nums&#xff0c;求和为target的两个数组元素的下标 我用了两个for循环&#xff0c;官方解为 哈希表&#xff0c;知识盲区 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<i…

React Hooks中useState的介绍,并封装为useSetState函数的使用

useState 允许我们定义状态变量&#xff0c;并确保当这些状态变量的值发生变化时&#xff0c;页面会重新渲染。 useState 返回值 const [state, setState] useState(initialState);useState 返回一个长度为 2 的数组。通常&#xff0c;我们这样定义状态变量&#xff1a; co…

Socket.D 替代 http 协议像 Ajax 一样开发前端接口

我们在"前端接口"开发时&#xff0c;使用 socket.d 协议有什么好处&#xff1a; 功能上可以替代 http 和原生 ws安全&#xff01;安全&#xff01;安全&#xff01;现有的工具想抓包数据&#xff0c;难&#xff01;难&#xff01;难&#xff01;&#xff08;socket.…

向爬虫而生---Redis 拓宽篇3 <GEO模块>

前言: 继上一章: 向爬虫而生---Redis 拓宽篇2 &#xff1c;Pub/Sub发布订阅&#xff1e;-CSDN博客 这一章的用处其实不是特别大,主要是针对一些地图和距离业务的;就是Redis的GEO模块。 GEO模块是Redis提供的一种高效的地理位置数据管理方案&#xff0c;它允许我们存储和查询…

1868_C语言单向链表的实现

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/c_basic: little bits of c. 1868_C语言中简单的链表实现 简单整理一下链表的实现&#xff0c;这一次结合前面看到的一些代码简单修改做一个小结。 主题由来介绍 以前工作之中链表的使用其实不多&#xff0c;主要是…

vue多tab页面全部关闭后自动退出登录

业务场景&#xff1a;主项目是用vue写的单页面应用&#xff0c;但是有多开页面的需求&#xff0c;现在需要在用户关闭了所有的浏览器标签页面后&#xff0c;自动退出登录。 思路&#xff1a;因为是不同的tab页面&#xff0c;我只能用localStorage来通信&#xff0c;新打开一个…

axios拦截器的使用?

Axios是一个基于Promise的HTTP库&#xff0c;可以用于浏览器和Node.js。Axios具有拦截请求和响应的能力&#xff0c;使得我们可以在请求被发送之前或响应被处理之前对其进行修改或查看。下面是一个Axios拦截器的简单示例&#xff1a; 1.添加请求拦截器&#xff1a; axios.in…

LightGlue-OpenCV 实现实时相机图片特征点匹配

LightGlue-OpenCV 文章目录 LightGlue-OpenCVStep 1: 创建虚拟环境Step 2: 安装 LightGlue-OpenCV 并运行Step3: 运行 demo_camera.py效果 原理 LightGlue 是一种新的基于深度神经网络&#xff0c;用来匹配图像中的局部特征的深度匹配器。是 SuperGlue 的加强版本。相比于 Supe…

Qt/QML编程学习之心得:Linux下USB接口使用(25)

很多linux嵌入式系统都有USB接口,那么如何使用USB接口呢? 首先,linux的底层驱动要支持,在linux kernal目录下可以找到对应的dts文件,(device tree) usb0: usb@ee520000{compatible = "myusb,musb";status = "disabled";reg = <0xEE520000 0x100…

【C程序设计】C指针

学习 C 语言的指针既简单又有趣。通过指针&#xff0c;可以简化一些 C 编程任务的执行&#xff0c;还有一些任务&#xff0c;如动态内存分配&#xff0c;没有指针是无法执行的。所以&#xff0c;想要成为一名优秀的 C 程序员&#xff0c;学习指针是很有必要的。 正如您所知道的…

探索LinkedIn:使用TypeScript和jsdom库的高级内容下载器

概述 LinkedIn是一个专业的社交网络平台&#xff0c;拥有超过7亿的用户和数以亿计的职位、公司和教育机构的信息。对于数据分析师、市场营销人员、招聘人员和其他对LinkedIn数据感兴趣的人来说&#xff0c;能够从LinkedIn上获取和分析这些信息是非常有价值的。 因此&#xff0…

如何恢复Mac误删文件?

方法1. 使用撤消命令 当你在 Mac 上删除了错误的文件并立即注意到你的错误时&#xff0c;你可以使用撤消命令立即恢复它。顾名思义&#xff0c;此命令会反转上次完成的操作&#xff0c;并且有多种方法可以调用它。如果你已经采取了其他操作或退出了用于删除文件的应用程序&…

虾皮怎么选品:虾皮(Shopee)跨境电商业务成功的关键步骤

在虾皮&#xff08;Shopee&#xff09;平台上进行跨境电商业务&#xff0c;选品是至关重要的一环。有效的选品策略可以帮助卖家更好地了解市场需求&#xff0c;提高销售业绩和客户满意度。以下是一些成功的选品策略&#xff0c;可以帮助卖家在虾皮平台上取得更好的业务成绩。 先…

作为程序员,我建议你学会写作

原创/朱季谦 如果你留意观察&#xff0c;便会发现&#xff0c;随着互联网的发展&#xff0c;现在已经变成一个全民写作的时代。写作不再是文学爱好者的权利&#xff0c;也不再是知识分子的专属&#xff0c;你只需一台可以联网的手机或者电脑&#xff0c;再有一点文字组织能力&…

Django5+DRF入门教程

官方文档&#xff1a;https://www.django-rest-framework.org/ 创建项目 # 创建目录 mkdir drf_demo cd drf_demo# 创建虚拟环境 python -m venv evnv venv/Scripts/activate# 安装Django pip install django# 安装DRF pip install djangorestframework# 创建Django项目 djan…

http1.0、http1.1、http2.0

http1.0 1、每次请求都会和服务器建立一个tcp连接&#xff0c;完成请求后就立即断开tcp连接、请求回来的页面文件如果包含img、js、css&#xff0c;会在此后再次请求。 2、每次请求都返回全部资源。 3、对单个域名的server连接有限。 4、缓存通过expires、if-modifies-sinc…

为什么Java中“1000==1000”为false,而”100==100“为true?

大家好&#xff0c;我是可乐。 在日常编程中&#xff0c;我们经常遇到一些看似简单却隐藏着复杂逻辑的问题。 比如&#xff0c;你是否想过为什么在 Java 中表达式10001000会返回 false&#xff0c;而 100100 却返回 true 呢&#xff1f; Integer a 100; Integer b 100; Sy…

k8s 运行深度学习 k8s实现原理

在大型分布式系统中,定会存在大量并发写入的场景。在这种场景下如何进行更好的并发控制,即在多个任务同时存取数据时保证数据的一致性,成为分布式系统必须解决的问题。 悲观并发控制和乐观并发控制是并发控制中采用的主要技术手段,对于不同的业务场景,应该选择不同的控制方…

网安入门10-文件上传(中国蚁剑)

​ 什么是文件上传漏洞——来自GPT-4 文件上传漏洞是一种常见的安全漏洞&#xff0c;它出现在Web应用程序中&#xff0c;允许攻击者上传恶意文件到服务器。这种漏洞可能导致严重的安全问题&#xff0c;例如服务器被入侵、数据泄露和应用程序功能受损。 文件上传漏洞通常由以…