查找问题目前我学到的一般的是用到顺序查找或者折半查找:折半查找使用时必须要保证数据整体有序,假设此时是增序的则与中间元素进行比较 int mid = left +(right - left) / 2;如果大于mid元素则向mid右方去寻找也就是使left = mid + 1,如果小于于mid元素则向mid右方去寻找也就是使right = mid - 1
这是一顺序查找的例子比较简单
KY158 找x
描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入描述:
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出描述:
对于每组输入,请输出结果。
示例1
输入:
2 1 3 0
复制输出:
-1
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
int op[202] = {0};
int search = -1;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++)
scanf("%d", &op[i]);
scanf("%d", &search);
int i = 0;
for(i = 0; i < n; i++){
if(op[i] == search){
printf("%d", i);
break;
}
}
if(i == n){
printf("-1\n");
}
}
}
再来一道二分查找的题,其中我看评论区的时候又学到一种hash表的方法感觉很妙分享到这里:
KY199 查找
描述
输入数组长度 n 输入数组 a[1...n] 输入查找个数m 输入查找数字b[1...m] 输出 YES or NO 查找有则YES 否则NO 。
输入描述:
输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。
输出描述:
如果在n个数组中输出YES否则输出NO。
示例1
输入:
5 1 5 2 4 3 3 2 5 6
复制输出:
YES YES NO
#include<iostream>
#include<algorithm>
using namespace std;
//二分查找的方法
bool BinarySearch(int arr[], int n, int target){
int left = 0, right = n - 1;
while(left <= right){
int mid = left + (right - left) / 2;//每次都要更新mid的值
if(arr[mid] == target){
return true;
}else if(arr[mid] < target){
left = mid + 1;
}else if(arr[mid] > target){
right = mid - 1;
}
}
return false;
}
int main(){
int n = 0, m = 0;
int arr[200] = { 0 };
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++)
cin>>arr[i];
sort(arr,arr + n);
cin>>m;
int target = -1;
for(int i = 0; i < m; i++){
cin>>target;
if(BinarySearch(arr, n, target)){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
}
return 0;
}
//hash存储的方法
int main(){
int n, m, target;
int arr[1000] = { 0 };
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
cin >> m;
arr[m] = 1;//hash表将该值当作hash表的索引运用了数组可随机存储的特性
}
cin >> m;
for(int i = 0; i < m; i++){
cin >> target;
if(arr[target] == 1){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
}
}