用二分查询一个有序向量(或数组)中是否存在vector<T>[i]==i;

server/2024/9/25 2:27:47/

0. 下面【1】使用了类,【2】使用了函数

解析:
 

  - 因为我们的代码中不存在l = mid+1;r = mid -1;这种可能会【跨越另一个指针】的情况,所以我们while条件写l+1!=r,言下之意,彼时你俩相差为1,我们就跳出循环了。

  - 跳出时存在两种情况1:r指向的就是答案,2:没有答案,连r指向的都不是答案。

  - 为什么最后检查 r 而不是 l?

  - 在循环结束时,r 总是指向可能的解。L始终指向小于其索引的元素,而 r 指向大于或等于其索引的第一个元素。

  - 因此,如果存在满足条件的元素,它一定在 r 的位置

  - 这种算法特别适用于已排序元素唯一的数组,其中我们要找的是第一个等于其索引的元素。

- 这段代码通过二分查找的思路,可以高效 【它的时间复杂度是 O(log n),比从头到尾遍历效率高多了】地找到了有序向量中第一个(元素本身等于其下标的元素,比如这个题中的3等于其下标3)

- 你可能会遇到的死循环风险: 如果你使用 l < r 作为循环条件,当 l 和 r 相邻时(即 l+1 == r),循环仍然会继续。因为 mid 的值始终会在 l 和 r 之间反复切换,无法收敛。

- 无法处理相邻元素的情况: 当目标元素恰好位于 l 和 r 之间时,使用 l < r 的条件会导致无法找到目标元素。

1.

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:int fun(vector<int>& nums) {int l = -1, r = nums.size();while (l + 1 != r) {int mid = l + r >> 1;if (nums[mid] < mid)l = mid;else r = mid;}if (nums[r] == r)cout << "find the pos is" << r;else cout << "-1";cout << endl;return 0;}
};int main() {Solution s;vector<int> vec{ -3,-1,1,3,5 };s.fun(vec);
}

2.

#include<vector>
#include<iostream>
using namespace std;
int main(){vector<int> vec{ -3,-1,1,3,5 };int l = -1, r = vec.size();while (l+1!=r) {int mid = (l+r)/2;if (vec[mid] < mid) {l = mid;}else {r = mid;}}if (vec[r] == r) {cout << "找到了,下标是" << r << endl;}else {cout << "没有找到" << endl;}
}


http://www.ppmy.cn/server/121600.html

相关文章

YOLO交通目标识别数据集(红绿灯-汽车-自行车-卡车等)

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000&#xff0c;xml和txt标签都有&#xff1b; ✓class&#xff1a;biker&#xff0c;car&#xff0c;pedestrian&#xff0c;trafficLight&#xff0c;trafficLight-Green&#xff0c;trafficLight-GreenLeft&#xff0c; t…

数据增强:提升机器学习模型性能的利器

在机器学习领域&#xff0c;尤其是在处理图像、语音或文本等复杂数据时&#xff0c;数据的质量和数量往往是决定模型性能的关键因素之一。然而&#xff0c;在实际应用中&#xff0c;高质量且多样化的数据集往往难以获取&#xff0c;尤其是在某些专业领域或稀有事件分析中。这时…

基于微信小程序的竞赛答题小程序开发笔记(一)

开发背景调研 中小学学科答题小程序&#xff0c;适合各中小学校方&#xff0c;老师或者家长。通过互动和参与式学习&#xff0c;小程序能够通过游戏化元素提升学习的积极性和参与度&#xff0c;从而提升学习效率&#xff0c;促进学生自主学习 功能规划 分类题库&#xff1a;…

单片机学到什么程度才可以去工作?

说实话&#xff0c;10几年前&#xff0c;我自学单片机转行的时候&#xff0c;也是一头雾水&#xff0c;也是一边苦苦挣扎&#xff0c;一边迷茫的状态。 硬件、软件、编程...样样都需要学&#xff0c;连从哪儿开始都不知道&#xff0c;每次看到那些密密麻麻的电路图和代码&#…

菱形继承的类对父类的初始化、组合、多态、多态的原理等的介绍

文章目录 前言一、菱形继承的类对父类的初始化二、组合三、 多态1. 构成多态2. 虚函数3. 虚函数的重写4. 虚函数重写的两个例外1. 协变2. 析构函数的重写 5. C11 final 和 override1. final2. override 6. 设计不想被继承的类7. 重载、覆盖&#xff08;重写&#xff09;、 隐藏…

计算机复习9.23

关系&#xff1a;一张扁平的二维表&#xff0c;关系应该具备每个分量都不可分的数据(1NF) 候选码&#xff1a;某个属性组可以唯一标识一个元组&#xff0c;而其子集不能&#xff0c;候选码中的属性叫主属性 主码&#xff1a;从候选码中选取一个称为主码 全码&#xff1a;所有…

C#设计模式之访问者模式

总目录 前言 在软件构建过程中&#xff0c;由于需求的改变&#xff0c;某些类层次结构中常常需要增加新的行为&#xff0c;如果直接在基类中做这样的更改&#xff0c;将会给子类带来很繁重的变更负担&#xff0c;甚至破坏原有设计。如何在不更改类层次结构的前提下&#xff0c…

数据脱敏-快速使用

1.数据脱敏定义 数据脱敏百度百科中是这样定义的&#xff1a; 数据脱敏&#xff0c;指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信…