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

代码随想录学习(二)——二分查找

二分查找知识点:

前提条件是数组为有序数组,同时数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件。

对区间的定义想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

左闭右闭区间二分法:

补充知识点:

类的写法示例:

以“学生(student)”类为例,完整代码如下:

#include <iostream>
#include <string>
using namespace std;// 定义Student类
class Student {
private:// 成员变量(属性):通常设为private,通过public函数访问(封装)string name;  // 姓名int age;      // 年龄float score;  // 成绩public:// 1. 构造函数:初始化对象,与类名相同,无返回值// (1)默认构造函数(无参)Student() {name = "未知";age = 0;score = 0.0f;}// (2)带参构造函数(重载)Student(string n, int a, float s) {name = n;age = a;score = s;}// 2. 析构函数:对象销毁时调用,用于释放资源(如动态内存)~Student() {// 这里没有动态资源,仅作示例cout << name << "的对象已销毁" << endl;}// 3. 普通成员函数(行为):操作成员变量// 设置姓名(setter)void setName(string n) {name = n;  // 可以在这里添加验证逻辑(如非空判断)}// 获取姓名(getter)string getName() {return name;}// 打印学生信息void showInfo() {cout << "姓名:" << name << ",年龄:" << age << ",成绩:" << score << endl;}// 修改成绩void updateScore(float newScore) {if (newScore >= 0 && newScore <= 100) {  // 验证成绩合法性score = newScore;} else {cout << "成绩无效!" << endl;}}
};// 主函数:使用Student类
int main() {// 创建对象(调用构造函数)Student s1;  // 调用默认构造函数Student s2("张三", 18, 90.5f);  // 调用带参构造函数// 调用成员函数s1.setName("李四");s1.updateScore(88.0f);s1.showInfo();  // 输出:姓名:李四,年龄:0,成绩:88s2.updateScore(95.5f);s2.showInfo();  // 输出:姓名:张三,年龄:18,成绩:95.5return 0;
}

类的使用场景:

封装:将数据(成员变量)和操作数据的方法(成员函数)捆绑,隐藏内部实现细节。

复用:通过继承(class子类:父类)复用已有类的功能。

扩展:通过多态(虚函数)实现“一个接口,多种实现”,提高代码灵活性。

动态数组:

vector 是 C++ 标准库提供的动态数组容器,它解决了传统数组的两个核心问题:

  • 传统数组大小固定(定义时必须指定长度,且无法动态扩容);
  • 传统数组需要手动管理内存(尤其是动态分配的数组 int* arr = new int[6]; 容易忘记释放)。

而 vector 可以自动扩容、自动管理内存,因此被称为 “动态数组”,是传统数组的升级版。

二分法代码:

#include <iostream>
#include <vector>
using namespace std;// 左闭右闭方法
class Solution{public:int search(vector<int>& num, int target){int left = 0;int right = num.size() - 1; // 定义target在左闭右闭的区间,[left, right]while (left <= right){int middle = left + ((right - left) / 2); // int 为近0取整if (num[middle] > target){right = middle - 1;}else if (num[middle] < target){left = middle + 1;}else{return middle;}}return -1;}
};int main(){vector<int> num = {-1, 0, 3, 5, 9, 12};int target = 13;Solution soultion;int result = soultion.search(num, target);if (result != -1){cout << "目标值" << target << "的索引为" << result << endl; }else{cout << "目标值" << target << "不在索引中" << result << endl;}return 0;
}

左闭右开区间二分法:

二分法代码:

#include <iostream>
#include <vector>
using namespace std;class Sloution{public:int search(vector<int>& nums, int target){int left = 0;int right = nums.size(); // 左闭右开while(left < right){int middle = left + ((right - left) / 2);if (nums[middle] > target){right = middle; // 前面的区间没取这个数}else if (nums[middle] < target){left = middle + 1; // 为什么加1,因为前面的区间取到了这个数了。}else{return middle;}}return -1;}
};int main(){vector<int> num = {-1, 0, 3, 5, 9, 12};int target = 13;Sloution solution;int result  = solution.search(num, target);if (result != -1){cout << "目标值" << target << "的索引为" << result << endl;}else{cout << "目标值" << target << "不存在" << endl;}
}

相关扩展题目:

35. 搜索插入位置 - 力扣(LeetCode)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)


文章转载自:

http://UFII9OLe.xmmbc.cn
http://Ep4bI3sI.xmmbc.cn
http://IYDk68KS.xmmbc.cn
http://jg7Gypua.xmmbc.cn
http://35bl6scF.xmmbc.cn
http://j4fgTmWd.xmmbc.cn
http://OxN8iLs0.xmmbc.cn
http://vzEuk3pR.xmmbc.cn
http://9aPSXQFX.xmmbc.cn
http://SbLod2WU.xmmbc.cn
http://QpM0BBYe.xmmbc.cn
http://vlBDT6dH.xmmbc.cn
http://S3LU7VUQ.xmmbc.cn
http://pAymVSPU.xmmbc.cn
http://guniC6ba.xmmbc.cn
http://BSw0qhc9.xmmbc.cn
http://DoPjxU1s.xmmbc.cn
http://SIFhKwj9.xmmbc.cn
http://U2iWbO0r.xmmbc.cn
http://iojaI25R.xmmbc.cn
http://hRPaD5DE.xmmbc.cn
http://62lIAa5c.xmmbc.cn
http://HRu4mP8m.xmmbc.cn
http://c1NiEx8G.xmmbc.cn
http://HWANg2xr.xmmbc.cn
http://ecsEdrqU.xmmbc.cn
http://XgmZxjRk.xmmbc.cn
http://HURMKCHZ.xmmbc.cn
http://AxIviRV5.xmmbc.cn
http://zYra4vjU.xmmbc.cn
http://www.dtcms.com/a/387203.html

相关文章:

  • 【代码随想录day 27】 力扣 53. 最大子序和
  • Zynq开发实践(SDK之第一个纯PS工程)
  • 【Spring生态】Spring Cloud
  • HarmonyOS应用拉起系列(三):如何直接拉起腾讯/百度/高德地图进行导航
  • Redis的主从库与切片集群机制
  • 打工人日报#20250916
  • WASM逆向
  • 如何计算最大公约数和最小公倍数
  • 我们设计时间戳的更新时间的时候通常将字段类型设置为int或者bigint 这样能避免2038的问题吗
  • 超越“防被告”:2025跨境电商IPR战略赋能与品牌升值之道
  • Scrapy进阶:POST请求模拟登录实战与管道的使用
  • Zabbix 7.0 配置钉钉告警
  • 知识拓展-智能体和数字人
  • 飞牛NAS部署影视站MooncakeTV
  • yolov8 和OPENCV 自带的目标检测模型 对比
  • 课前练习题-20250916-复习题
  • 基于Transformer-卷积神经网络和度量元学习的高压断路器小样本机械故障诊断
  • 基于 Rust 的 IoT 平台基础功能设计(一)
  • vue+typescript+node的前端项目
  • catkin工程和CMakelist.txt的基本使用
  • 使用 MyCat 实现 MySQL 主从读写分离
  • Visual Studio 函数头显示引用个数
  • 【毕业设计选题】大数据技术专业毕业设计选题指南指南:python(2026 届)
  • 组播实验指导
  • Easylogger与RTT结合使用 Easylogger在FreeRTOS下实现异步输出
  • 【openFeign详细介绍】
  • 抖音私信评论互动消息通知监听自动获取,通过qq机器人转发到qq来通知
  • 19.删除链表的倒数第N个节点(双指针妙用)
  • MySQL笔记5
  • 从《Attention Is All You Need》深入理解Transformer