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

news2024/10/22 16:21:19

查找

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

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否则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;
}
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){//5
		for(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);//3
			for(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.coloradmin.cn/o/1498617.html

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

相关文章

ACM题解Day10|总结篇|进制转化,GCD ,LCM ,二分答案

&#x1f525;博客介绍&#xff1a; 27dCnc [Cstring中find_first_not_of()函数和find_last_not_of()函数-CSDN博客] 方差,期望 概率 今日打卡: 算法周总结 ACM题解Day3| To Crash or not To Crash,Integer Prefix ,I don’t want to pay for the Late Jar-CSDN博客 第3题:…

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

如何将 ONLYOFFICE 协作空间部署到 Kubernetes / OpenShift 集群中

需要 ONLYOFFICE 协作空间的可扩展实例吗&#xff1f;使用 Helm 轻松将其安装到 Kubernetes 或 OpenShift 集群中。阅读本文了解详情。 ONLYOFFICE 协作空间是什么 ONLYOFFICE 协作空间是一个协同办公平台&#xff0c;能够帮助用户更好地与客户、业务合作伙伴、承包商及第三方…

驱动调试第013期-G120XA驱动同步电机应用案例

概述 SINAMICS G120XA是西门子SINAMICS系列变频器的新成员&#xff0c; 功率范围覆盖0.75 kW~560 kW&#xff0c;内置风机和水泵行业应用功能&#xff0c;汇集了优异的高性能矢量控制算法&#xff0c;可以轻松的驱动风机、水泵及压缩机等负载。胜任各种应用场合&#xff0c;专…

【python基础学习11课_异常机制】

一、异常 1、异常的定义 异常&#xff1a;程序无法继续执行异常会中断程序执行异常处理&#xff0c;是为了不中断程序执行。而不是避免错误。有些代码是报错就是要暴露出来有了异常机制&#xff0c;错误的代码报错后抛出异常&#xff0c;代码从上到下&#xff0c;报错代码后面…

触发HTTP preflight预检及跨域的处理方法

最近在做需求的过程中&#xff0c;遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结&#xff1a; 哪些情况会触发HTTP preflight preflight属于cors规范的一部分&#xff0c;在有跨域的时候&#xff0c;在一定情况下会触发preflig…

字节开启新一轮期权回购,价格又涨了(含算法原题)

字节期权 近日&#xff0c;字节跳动开启新一轮期权回购&#xff0c;价格微涨至 170 美元。 之前我们就写过 文章&#xff0c;分享历年来字节跳动的期权变化情况&#xff0c;这里再贴一下&#xff1a; 18年&#xff1a;10 19年&#xff1a;30 20年&#xff1a;60-70 21年&#x…

Linux系统编程(六)高级IO

目录 1. 阻塞和非阻塞 IO 2. IO 多路转接&#xff08;select、poll、epoll&#xff09; 3. 存储映射 IO&#xff08;mmap&#xff09; 4. 文件锁&#xff08;fcntl、lockf、flock&#xff09; 5. 管道实例 - 池类算法 1. 阻塞和非阻塞 IO 阻塞 IO&#xff1a;会等待操作的…

决定马里兰州地区版图的关键历史事件

1. 马里兰殖民地的建立&#xff1a; - 1632年&#xff0c;英国国王查理一世将一大片土地赐予塞西尔卡尔弗特男爵&#xff0c;这片土地是为了纪念国王的妻子亨丽埃塔玛丽亚而命名为“马里兰”。卡尔弗特和他的儿子随后建立了马里兰殖民地&#xff0c;这标志着马里兰作为一个独立…

车辆伤害VR安全教育培训复用性强

VR工地伤害虚拟体验是一种新兴的培训方式&#xff0c;它利用虚拟现实技术为参与者提供身临其境的体验。与传统的培训方式相比&#xff0c;VR工地伤害虚拟体验具有许多优势。 首先&#xff0c;VR工地伤害虚拟体验能够模拟真实的工作环境和事故场景&#xff0c;让参与者在安全的环…

hdu-2059(dp)

hdu-2059 龟兔赛跑 dp[i] 表示到第i个站所花费的最少时间&#xff0c;t[j][k]表示在第j个站充满电&#xff0c;直接开到第k个站所花的时间&#xff0c;那么状态转移为: dp[i] min(dp[i], dp[j] t[j][i]) 含义为&#xff0c;假设我们当前想知道到达第i个站的最少时间&#xff…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球&#xff0c;给人留下深刻的印象。作为前端开发人员&#xff0c;可以通过不断学习和掌握设计技巧和工具&#xff0c;提升自己的UI设计能力&#xff0c;为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议&#xff1a; 学习设计基础知…

苹果发布iOS17.4正式版升级,罕见带来一大波新功能!苹果数据备份软件 iOS系统管理软件 苹果数据备份到icloud iOS系统数据处理

近日&#xff0c;苹果发布了iOS17.4正式版&#xff0c;没想到的是居然有一大波新功能&#xff0c;如果你也是用iPhone的话&#xff0c;尤其是iPhone15新系列的&#xff0c;那么推荐你一定要升级下。下面让我给大家详细讲讲&#xff1a; 「电池健康」升级 电池设置界面得到了优…

图书馆管理系统(2)

接下来实现系统的子菜单&#xff0c;在写一个子模块的时候&#xff0c;其他子模块先屏蔽起来&#xff0c;因为没实现&#xff0c;代码运行就通不过 屏蔽起来写上todo&#xff0c;后面(Ctrl键F)搜索&#xff0c;找todo来实现 先来实现图书管理模块 第一步&#xff0c;先要把图…

【STM32】HAL库 CubeMX教程---基本定时器 定时

目录 一、基本定时器的作用 二、常用型号的TIM时钟频率 三、CubeMX配置 四、编写执行代码 实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM6&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、基本定时器的作用 基本定时器&#xff0c;主要用于实现定时和计数功能…

Vue3_2024_6天【回顾上篇watch常见的前三种场景】另两种待补

第一种情况&#xff1a;监视【ref】定义&#xff08;基本数据类型&#xff09; 1.引入watch2.格式&#xff1a;watch&#xff08;基本数据类型数据&#xff0c;监视变化的回调函数&#xff09; 注意点&#xff1a; 2.1.watch里面第一个参数&#xff0c;是数据~~【监视的基本类…

IPSec VPN配置实验

什么是IPSec VPN&#xff1f; IPSec VPN其实就是一种基于互联网协议安全&#xff08;IPSec&#xff09;的虚拟私人网络技术&#xff0c;它通过在IP层加密和认证数据包来确保数据传输的安全性。 IPSec VPN的主要特点包括&#xff1a; 安全性&#xff1a;IPSec提供了强大的安全…

14:00面试,15:00就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到2月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【异常处理】Vue报错 Component template should contain exactly one root element.

问题描述 启动VUE项目后控制台报错&#xff1a; Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.翻译为&#xff1a;组件模板应该只包含一个根元素 查看vue代码&#xff0…

IJCAI23 - Continual Learning Tutorial

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本篇 Tutorial 主要介绍了 CL 中的一些基本概念以及一些过往的方法。 Problem Definition Continual Learning 和 Increm…