目录
- 题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个值不存在,输出-1
if (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;
//数组元素放入arr
int* arr = new int[n];
for(int i = 0; i < n; ++i)
{
cin >> arr[i];
}
//查询元素放入arr_q
int* arr_q = new int[q];
for(int i = 0; i < q; ++i)
{
cin >> arr_q[i];
}
//查询结果放入result
int* 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;
//数组元素放入arr
int* arr = new int[n];
for(int i = 0; i < n; ++i)
{
cin >> arr[i];
}
//查询元素放入arr_q
int* 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;
}