王道机试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.mzph.cn/news/728072.shtml

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

相关文章

【uni-app小程序开发】实现一个背景色渐变的滑动条slider

最近做的一个用uni-app+vue2开发的微信小程序项目中要实现一个滑动进度控制条,如下图所示: 1. 滑动条需要渐变背景色 2. 滑块的背景色需要与当前位置滑动条的背景色一致(动态改变) 碰到这样的需求,我当然先是看看官方提供的slider组件和uView里的u-slider组件能不能满足…

Javaweb之Web后端开发总结的详细解析

4. Web后端开发总结 到此基于SpringBoot进行web后端开发的相关知识我们已经学习完毕了。下面我们一起针对这段web课程做一个总结。 我们来回顾一下关于web后端开发&#xff0c;我们都学习了哪些内容&#xff0c;以及每一块知识&#xff0c;具体是属于哪个框架的。 web后端开…

nyist_acm 个人积分赛1(部分题解会补充)

Mirrored String II 看到题解说是马拉车算法&#xff0c;我赛时并没想到&#xff08;好吧其实我是比赛完才知道有马拉车这个算法&#xff09; 因为字符串的长度只有1000&#xff0c;直接暴力跑其实就可以了&#xff0c;但是要注意的是&#xff1b;回文串有俩种形式&#xff0c…

1. Gin框架入门

文章目录 一、Gin框架介绍二、RESTful API三、Gin渲染1. HTML渲染2. 自定义模板函数3. 静态文件处理4. 使用模板继承5. 补充文件路径处理6. JSON渲染7. XML渲染8. YMAL渲染9. protobuf渲染 四、Gin获取各种方式传递过来的参数1、获取querystring参数2、获取form参数3、获取path…

Vue3实现页面跳转功能

目标&#xff1a; 首页&#xff1a; 点击About后&#xff1a; 第一步&#xff1a;安装 Vue Router和创建你先 npm install vue-router4第二步&#xff1a;在router.js中设置路由 import { createRouter, createWebHistory } from vue-router; import Home from ./views/Home…

如何写一份简单的产品说明书,教程奉上

如果你是一位新晋产品经理&#xff0c;或者正在研发新产品&#xff0c;并且心中惴惴不安因为未知的产品说明书制作环节&#xff0c;那么今天你就来对地方了。本篇文章将教你如何创建一份简单明了的产品说明书。让我们开始吧&#xff01; 首先&#xff0c;明确产品说明书的目标。…

达梦数据库基础操作(二):表空间操作

达梦数据库基础操作(二)&#xff1a;表空间操作 1. 表空间操作 1.1 达梦表空间介绍 表空间的概念&#xff1a; 每个DM 数据库都是由一个或者多个表空间组成&#xff0c;表空间是一个逻辑的存储容器&#xff0c;它位于逻辑结构的顶层&#xff0c;用于存储数据库中的所有数据&am…

【CSP试题回顾】201503-3-节日

CSP-201503-3-节日 关键点&#xff1a;格式化输出 在C中&#xff0c;格式化输出通常利用iostream库中的功能&#xff0c;特别是iomanip头文件提供的一系列操作符。这些操作符用于控制输出格式&#xff0c;如宽度、填充、对齐方式等。在你提供的代码中&#xff0c;用于格式化输…

基于Springboot+Layui餐厅点餐系统

一、项目背景 在互联网经济飞速发展的时代&#xff0c;网络化企业管理也在其带领下快速兴起&#xff0c;开发一款自主点餐系统会受到众多商家的青睐。现如今市场上的人力资源价格是非常高昂的&#xff0c;一款自主点餐系统可以减少餐厅的人力开销&#xff0c;将服务员从繁忙的…

RESTful接口规范参考

介绍 REST&#xff08;Representational State Transfe&#xff09;&#xff0c;一种架构设计风格&#xff0c;而不是强制标准&#xff0c;主要用于客户端与服务端接口规范&#xff1b;在现代的软件开发中&#xff0c;RESTful API已经成为应用程序之间通信的重要桥梁&#xff…

电磁兼容EMC:单、双面板的均匀传输线

目录 1 传输线 2 均匀传输线 3 特征阻抗 4 应用案例 为何要讲单、双面板的均匀传输线&#xff1f;因为均匀传输线能保证信号质量&#xff0c;减少EMC问题&#xff0c;而单双面板没有完整的地和电源平面&#xff0c;很难实现均匀传输线的布线&#xff0c;所以更需要知道如何在…

08 |「Fragment 」

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、简介1、是什么2、为什么要有 Fragment3. Fragment 详细解释 二、Fragment 与 Activity 的直观理解三、Fragment 的创建1、Fragment 的创建方式2、Fragment 的增删替查1&#xff09; 替换&#xff08;常见&…

01背包问题 刷题笔记

思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…

关于汽车E\E架构演进的思考(2)

目录 1.概述 2. 整车通信的限制 3 如何保证融合ECU的功能安全和信息安全 4.小结 1.概述 上篇文章主要聊了当前电子电气架构以及未来电子电气架构的特点&#xff0c;简述了即将要面临的挑战&#xff0c;下面我们继续讲述挑战。 2. 整车通信的限制 下一代架构主要以以太网…

Centos9环境部署MySQL的PXC

前期理解 pxc就是将多个mysql数据库整合为一个集群&#xff0c;每台服务器上的mysql数据库会实时同步&#xff0c;而且节点与节点之间&#xff0c;他们相互的关系是对等的。PXC 最关注的是数据的一致性&#xff0c;对待事物的行为时&#xff0c;要么在所有节点上执行&#xff…

爬虫(四)

1.图片验证码 import requestsres requests.get(https://www.gushiwen.cn/RandCode.ashx)with open("code.png", "wb") as f:f.write(res.content)2.打码平台 网址&#xff1a;http://www.ttshitu.com/&#xff0c;找到开发文档点击Python,没有钱了要用我…

Leetcode148 排序链表

排序链表 题解1 线性表题解2 自顶向下归并排序题解3 自底向上归并排序 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回排序后的链表 。 题解1 线性表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…

React-Redux简单使用

1.配置环境 1.1开启项目 npx create-react-app react-redux-pro 1.2安装配套工具 说明&#xff1a;安装Redux Toolkit和react-redux。Redux Toolkit(RTK)~官方推荐编写Redux逻辑的方式&#xff0c;是一套工具的集合集&#xff0c;简化书写方式&#xff1b;react-redux-用来…

【Leetcode】3028.边界上的蚂蚁

题目描述 思路 题目中要求我们返回 蚂蚁返回到边界的次数。简单来想&#xff0c;就是蚂蚁原来的位置的一维坐标为0&#xff0c;然后经过&#xff0c;若干次移动&#xff0c;统计有几次坐标再次变为0的个数。 我们利用前缀和&#xff0c;像定义一个数组&#xff0c;算出前缀和数…

CleanMyMac X 4.14.6 2024核心功能详解 CleanMyMac X中文官网安装包 Mac电脑系统清理软件

CleanMyMac 是 macOS 上久负盛名的系统清理工具&#xff0c;2018 年&#xff0c;里程碑式版本 CleanMyMac X 正式发布。不仅仅是命名上的变化&#xff0c;焕然一新的 UI、流畅的动画也让它显得更加精致。新增的系统优化、软件更新等功能&#xff0c;使得在日常使用 macOS 时有了…