王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找

查找是另一类必须掌握的基础算法,它不仅会在机试中直接考查,而且是其他某些算法的基础。之所以将查找和排序放在一起讲,是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序,那么在查找某个特定的元素时,需要依次检查所有的元素,这样的方式对于单次或少量的查找来说运行效率是很高的,但查找次数较多时,如果所有元素都是有序的,那么就能更快地进行检索,而不必逐个元素地进行比较。

x(哈工大复试上机题)

题目描述:
输入一个数 n ,然后输入 n 个不同的数值,再输入一个值 x ,输出这个值在数组中的下标(从 0
开始,若不在数组中则输出- 1 )。
输入: 测试数据有多组。输入 n 1 <=   n <=  200 ),接着输入 n 个数,然后输入 x
输出: 对于每组输入, 请输出结果。
样例输入:
2
1 3
0
样例输出:
-1
思路提示:

当循环结束时,如果 idx 的值等于数组的长度 n,这表示遍历整个数组后仍然没有找到目标值 x。因为数组的下标是从 0 到 n-1,所以如果 idx 的值等于 n,那么意味着目标值 x 不在数组中。

代码表示:
#include <bits/stdc++.h>
using namespace std;int main(){int n;char a[200];scanf("%d",&n);for(int i=0;i<n;++i){scanf("%d",&a[i]);}int x;scanf("%d",&x);//查找操作 int idx;//变量作用域 for(idx=0;idx<n;++idx){if(x==a[idx]){printf("%d\n",idx);break;}}if(idx==n){//找不到元素 printf("-1\n");	}}

二分查找:

1、有序数组;2、注意迭代和边界问题

利用传递性,选择合适的比较对象来减少比较次数。

题目描述:

输入数组长度 n 输入数组      a[1...n] 输入查找个数m 输入查找数字b[1...m]   输出 YES or NO  查找有则YES 否则NO 。

输入描述:输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。

输出描述:如果在n个数组中输出YES否则输出NO

代码表示:
#include <bits/stdc++.h>
using namespace std;
int arr[100];//全局数组,便于在不同数组中共享 
bool binarySearch(int n,int x){//查到返回ture否则falseint left=0;int right=n-1;while(left<=right){//易出错 int mid=(left+right)/2;if(arr[mid]==x){return true;}else if(arr[mid]>x){right=mid-1;//右边缘往左边缩
//最后的边界情况 right 和left相等,right可能变为left-1 }else{left=mid+1;} } return false;
}
int main(){int n,m;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;++i){scanf("%d",&arr[i]);}//排序sort(arr,arr+n); scanf("%d",&m);//读取m个数据for(int i=0;i<m;++i){int x;scanf("%d",&x);	if(binarySearch(n,x)){printf("YES\n");}else{printf("NO\n");}} } 
}
心得体会:

仔细理解二分查找的过程函数

bool binarySearch(int n,int x){
    //查到返回ture否则false
    int left=0;
    int right=n-1;
   while(left<=right){  //易出错 
        int mid=(left+right)/2;
        if(arr[mid]==x){
            return true;
        }else if(arr[mid]>x){
            right=mid-1;//右边缘往左边缩
//最后的边界情况 right 和left相等,right可能变为left-1 
        }else{
            left=mid+1;
        } 
    } 
    return false;
}


二分查找与map的关系

题目描述

见上题

代码表示
#include <bits/stdc++.h>
using namespace std;
int main(){map<int,int> findIndex;//元素和下标都是整型 int m,n;int arr[101];while(scanf("%d", &n) != EOF){//5for(int i=0;i<n;++i){for(int i=0;i<n;++i){scanf("%d",&arr[i]);//1 5 2 4 3
//将数组元素作为键,数组元素的下标作为值,插入到 map findIndex 中。findIndex[arr[i]]=i;}scanf("%d",&m);//3for(int i=0;i<m;++i){int findNum;//待查找元素 scanf("%d",&findNum); //2 5 6
//两个迭代器:findIndex.begin()第一个元素  findIndex.end()尾后迭代器 
//find函数返回找到的那个元素迭代器 
//查找元素 findNum 是否存在于 map findIndex中if(findIndex.find(findNum)==findIndex.end()){printf("NO\n");}else{printf("YES\n");}}}}
}
心得体会

1、map的键值对:

map 是一种数据结构,类似于字典或者映射表,它将一个键(key)和一个值(value)关联起来。

通过将数组元素作为键,数组元素在数组中的位置作为值存储到 map 中,我们可以实现以下功能:

  • 可以快速查找某个特定的元素是否存在于数组中;
  • 如果存在,还可以直接获取该元素在数组中的位置

具体到这段代码中的使用,我们声明了一个 map<int, int> findIndex;,表示这个 findIndex 是一个从整数键到整数值的映射。在循环中,我们将数组 arr 中的整数作为键,它们在数组中的位置作为值存储到 findIndex 中。

当我们执行 findIndex[arr[i]] = i; 时,实际上是在 map 中创建了一个键值对,键是 arr[i],值是 i。这样,在之后的查找操作中,我们可以通过键(即 arr[i])快速地找到对应的值(即 i)。

2、输入的主要功能是从输入中读取整数 n,然后读取 n 个整数到数组 arr 中,并将这些整数作为键,它们在数组中的下标作为值,存储到名为 findIndex 的 map 容器中。

接着程序会再次读取一个整数 m,然后循环 m 次,每次读取一个待查找的元素 findNum,并在 findIndex 中查找是否存在这个元素。如果存在,则输出 "YES",否则输出 "NO。

3、当我们执行 findIndex.find(findNum) 时,它会返回一个指向包含指定键 findNum 的键值对的迭代器。findIndex.find(findNum) 方法能够帮助我们快速地查找指定的键。


找最小的数

题目描述

第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x y。输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下y最小的。 

输入描述:输入有多组数据。 每组输入n,然后输入n个整数对。

输出描述:输出最小的整数对。

代码表示
#include <bits/stdc++.h>
using namespace std;int main() {int n;scanf("%d", &n);int arx[1001];int ary[1001];for (int i = 0; i < n; ++i) {scanf("%d%d", &arx[i], &ary[i]);}int min_x = arx[0];//需要专门来一个变量放最小值int min_y = ary[0];for (int j = 1; j < n; ++j) {if (arx[j] < min_x || (arx[j] == min_x && ary[j] < min_y)) {min_x = arx[j];min_y = ary[j];}}printf("%d %d\n", min_x, min_y);return 0;
}

打印极值点下标

习题描述

在一个整数数组上,对于下标为 i 的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称该整数为一个极值点,极值点的下标就是i。

输入描述:每个案例第一行为此数组元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔

输出描述:每个案例输出为n个数字(其中n为该案例中极值点的个数):每个数字对应相应数组的相应极值点下标值,下标值之间用空格分隔。

未完待续。。。。。。。。。。。。。自习室有对贼能说情侣,吵得下不下去啦(╯▔皿▔)╯明天写

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

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

相关文章

线性代数笔记13--正交向量和正交子空间

0. 四个子空间 1. 正交向量 两向量点乘为0&#xff0c;向量正交。 A ⊤ B 0 A^{\top}B0 A⊤B0 勾股定理 ∣ ∣ x ∣ ∣ 2 ∣ ∣ y 2 ∣ ∣ ∣ ∣ x y ∣ ∣ 2 ||x||^2||y^2||||xy||^2 ∣∣x∣∣2∣∣y2∣∣∣∣xy∣∣2 验证正交条件 ∣ ∣ x ∣ ∣ 2 x ⊤ x x x ⊤ ∣…

Qt ini配置文件

ini文件用于保存用户的设置操作&#xff0c;下列以背景颜色设置为例子 暂时默认设置为白色背景 这段代码放置在主窗口的构造函数中&#xff0c;用于初始化读取ini文件 QString color;QSettings *set new QSettings("color.ini",QSettings::IniFormat);set->begi…

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习:创建并调用函数-字符集合的并集-上机代码

Python语言基础与应用-北京大学-陈斌-P32-31-计算和控制流-上机练习&#xff1a;创建并调用函数-字符集合的并集-上机代码 本文环境&#xff1a; win10 Thonny4.1.4 # 函数训练字符集合的并集 def my_union(str1,str2):list1 []list2 []i 0 while i < len(str1):lis…

OpenAI官方发文:对于马斯克起诉Opanai的看法

双方立场 马斯克的观点&#xff1a;投入资金将OpenAi并入特斯拉&#xff0c;实现从非盈利组织到盈利组织的转变。 OpenAi的观点&#xff1a;OpenAI 的使命是确保 AGI 惠及全人类&#xff0c;需要筹集资金搞研发&#xff0c;以非盈利组织模式运营&#xff0c;不急于实现盈利。盈…

钉钉群内自定义机器人发送消息功能实现

文章目录 钉钉群内自定义机器人发送消息功能实现1、设置webhook自定义机器人2、查看官方文档&#xff0c;使用open api3、编写业务代码4、发送成功结果如下 钉钉群内自定义机器人发送消息功能实现 1、设置webhook自定义机器人 设置关键词 添加完成后&#xff0c;获得改机器人的…

为什么 JavaScript 中的 0.1 + 0.2 不等于 0.3

本文作者为 360 奇舞团前端开发工程师 在使用 JavaScript 处理运算时&#xff0c;有时会碰到数字运算结果不符合预期的情况&#xff0c;比如经典的 0.1 0.2 不等于 0.3。当然这种问题不只存在于 JavaScript&#xff0c;不过编程语言的一些原理大致相通&#xff0c;我以 JavaSc…

Matter 笔记1-环境准备,编译

不要远程登录Ubuntu输入以下命令&#xff0c;原因&#xff1a;ubuntu/linux上的http代理设置 1. 准备 1.1 工具 Ubuntu 22.04 LTSClash 里General的端口设置到ubuntu 的网络设置里 1.2 代码 这里使用芯科整理过的代码 git clone https://github.com/SiliconLabs/matter.…

Linux:kubernetes(k8s)探针ReadinessProbe的使用(9)

本章yaml文件是根据之前文章迭代修改过来的 先将之前的pod删除&#xff0c;然后使用下面这个yaml进行生成pod apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标…

Requests教程-15-文件上传与下载

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节&#xff0c;我们学习了requests的HTTPS请求方法&#xff0c;本小节我们讲解一下在requests文件上传与下载。 文件上传 使用requests库上传文件时&#xff0c;需要使用files参数&#xff0c;并将文件打…

仪酷LabVIEW OD实战(4)——Object Detection+OpenVINO工具包快速实现yolo目标检测

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『仪酷LabVIEW目标检测工具包实战』 &#x1f4d1;上期文章&#xff1a;『仪酷LabVIEW OD实战(3)——Object Detectiononnx工具包快速…

Python(38):Request的data需入参是json,用转换json.dumps(data)

Python接口自动化测试遇到问题:误传str类型给request 接口请求数据用str传参报错&#xff0c;请求响应报错 排查原因&#xff1a;查看服务器报错是Json解析报错。 1.1、如果直接入参&#xff0c;进行request请求的数据&#xff1a; data请求值为&#xff1a; reqData {&quo…

【Python】6. 基础语法(4) -- 列表+元组+字典篇

列表和元组 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. num1 10 num2 20 num3 30 ......但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候,…