目录
1、基础查找
题目描述:输入元素个数、元素、待查找元素,找到返回下标,未找到返回-1。
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int arr[200];
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int x, idx;
scanf("%d",&x);
for(idx=0;idx<n;idx++){
if(arr[idx]==x){
printf("%d",idx);
break;
}
}
if(idx==n){
printf("-1");
}
return 0;
}
2、估计时间复杂度
CPU频率在10^-9,则时间复杂O(n^2)适用于数量级10^5。
3、例题:牛客网 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
解法一 二分查找
适用条件:有序数组
注意:迭代和边界条件
【思路】:基础排序O(NlogN)+二分查找O(logN)
顺序查找O(N)
给一组规模为N的输入,查找M次:
顺序查找O(MN),二分查找O(NlogN+MlogN)
则对于一组输入查找多次,适用二分查找。
【注意】:1、定义全局数组,方便操作(二分查找直接传入)
2、输入的第二个变量是查找元素的个数,非带查找元素
#include <cstdio>
#include <algorithm>
using namespace std;
int arr[100];//全局数组,方便在各函数之间共享
bool binarySearch(int n,int x) { //n:数组元素个数 x:待查找元素
int left = 0, 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;
} else {
left = mid+1;
}
}
return false;
}
int main() {
int n;//数据个数
while(scanf("%d",&n)!=EOF) {
for(int i=0; i<n; i++) {
scanf("%d",&arr[i]);
}
sort(arr,arr+n);//排序,成为有序数组
int m;//待查找个数
scanf("%d",&m);
for(int i=0; i<m; i++) {
int x;
scanf("%d",&x);
if(binarySearch(n,x)) {
printf("YES\n");
} else {
printf("NO\n");
}
}
}
return 0;
}
解法二 使用map进行查找
【注意】
1、map<int, int> 名称;
将数组元素作为键,数组名称作为值,插入到map中。
2、键—>值
元素 下标
在map容器中,指向键值对地址的指针称为“迭代器”。
findIndex.find(x) :find()函数会返回找到的元素的迭代器。
findIndex.begin() 指向map中第一个元素,findIndex.end()指向尾元素的后一个元素
3、map底层为一个二叉搜索树,构建O(NlogN),查找O(logN),与二分查找相同但代码更简单,但待查找数据较多时,占据空间会大于二分查找,注意空间复杂度。
#include <cstdio>
#include <map>
using namespace std;
int main(){
map<int,int> findIndex;
int n, m;
int arr[100];
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
//将数组元素作为键,数组下标作为值,插入到map中
findIndex[arr[i]] = i;
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int x;//待查元素
scanf("%d",&x);
if(findIndex.find(x)==findIndex.end()) {
printf("NO\n");
}else{
printf("YES\n");
}
}
}
}