查找
找 x(哈工大复试上机题)
题目描述:
思路提示:
当循环结束时,如果 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为该案例中极值点的个数):每个数字对应相应数组的相应极值点下标值,下标值之间用空格分隔。
未完待续。。。。。。。。。。。。。自习室有对贼能说情侣,吵得下不下去啦(╯▔皿▔)╯明天写