目录
- 题1:输出数组中第k小的数
- 在数组内找出查找数字在该数组第一次出现的索引
题1:输出数组中第k小的数
题目描述:
给定一个数组arr 输出数组中第k小的数
如果不存在 输出-1
输入格式:
第一行输入一个数字n 代表数组arr大小
第二行依次输入n个数
第三行输入一个数字k
输出格式:
输出数组中第k小的数 如果不存在 输出-1
测试样例:
分析:
根据set容器去重的特性以及set容器内部按照从小到大的顺序排列
将数组内所有元素输入到set容器内,然后对set迭代器进行遍历,如果遍历到第k个元素存在则存在第k小的数,进行输出;如果不存在,也就是迭代器到end的位置,则输出-1。举例:
数组元素:3 3 2
set容器:2 3
如果k=2,则输出3
如果k=3,此时set迭代器遍历到end()的位置,不存在该数据,则输出-1
#include<iostream>
#include<set>using namespace std;
int main()
{//数组大小int n;//定义第k小的数int kmin;cin >> n;int *arr = new int[n];//给数组元素传值for (int i = 0; i < n; ++i){cin >> arr[i];}//数组传入set容器set<int> s(arr, arr + n);cin >> kmin;//用来记录遍历位置int count = 1;set<int>::iterator it = s.begin();while (it != s.end()){//如果第k小的数存在则输出该值,跳出循环if (count == kmin){cout << *it;break;}++it;++count;}//如果循环正常结束,则第k个值不存在,输出-1if (it == s.end()){cout << -1 << endl;}delete[] arr;return 0;
}
在数组内找出查找数字在该数组第一次出现的索引
题目描述
给定一个长度为N的单调不递减整数数组 arr,进行Q次询问。对于每次询问,给出一个整数X,要求找出X在arr中第一次出现的下标,如果X未在数组中出现过,则输出-1。
输入格式
第一行输入两个整数N,Q 其中N 代表数组 arr 长度,Q代表询问次数
第二行输入N个整数 用空格分开
第三行输入Q个整数 用空格分开
输出格式
在一行中输出Q次查询的结果 每个整数用空格分开
分析:
用三个数组分别记录要查询的值,被查询的值,值在给定数组的索引。
首先给出最简单遍历的方法,该方法时间复杂度较高
int main()
{int n,q;cin >> n >> q;//数组元素放入arrint* arr = new int[n];for(int i = 0; i < n; ++i){cin >> arr[i];}//查询元素放入arr_qint* arr_q = new int[q];for(int i = 0; i < q; ++i){cin >> arr_q[i];}//查询结果放入resultint* result = new int[q];for(int i = 0; i < q; ++i){int Q = arr_q[i];int idx = -1;for(int j = 0; j < n; ++i){if(arr[j] == Q){idx = j;break;}}result[i] = idx;}for(int i = 0; i < q; ++i){cout << result[i] << " ";}cout << endl;delete[] arr;delete[] arr_q;delete[] result;return 0;
}
方法二:
上述方法在面对数据量大时时间复杂度过高,可以使用二分查找降低查询次数。
#include<iostream>using namespace std;int binarySearch(int* arr, int n, int Q)
{int left = 0;int right = n - 1;int idx = -1;while(left <= right){int mid = (right + left)/2;if(arr[mid] == Q){idx = mid;right = mid - 1;}else if(arr[mid] > Q){right = mid - 1;}else if(arr[mid] < Q){left = mid + 1;}}return idx;
}int main()
{int n,q;cin >> n >> q;//数组元素放入arrint* arr = new int[n];for(int i = 0; i < n; ++i){cin >> arr[i];}//查询元素放入arr_qint* arr_q = new int[q];for(int i = 0; i < q; ++i){cin >> arr_q[i];}int* result = new int[q];for(int i = 0; i < q; ++i){int Q = arr_q[i];int idx = binarySearch(arr, n, Q);result[i] = idx;}for(int i = 0; i < q; ++i){cout << result[i] << " ";}cout << endl;delete[] arr;delete[] arr_q;delete[] result;return 0;
}