题目描述:
给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。
思路:先统计各种数的个数(map),再根据个数排序,最后计算最少数目。
代码:
#include<iostream>
using namespace std;
#include<map>
#include<vector>
#include<algorithm>
int main()
{
int arr[100000] = { 0 };//数组
int num;//数组大小
int k;
cout << "请输入数组个数" << endl;
cin >> num;
for (int i = 0; i < num; i++)
{
cout << "请输入" << i + 1 << "个数" << endl;
cin >> arr[num];
}
cout << "请输入整数k" << endl;
cin >> k;
map<int, int>temp;
for (int i = 0; i < num; i++)
{
temp[arr[i]] += 1;//根据key值统计每种数的个数;
}
vector<int>v;//用于存储每种数的个数
for (auto i : temp)
{
v.push_back(i.second);
}
sort(v.begin(), v.end()-1);//根据个数排序 v.end是最后一个元素的下一个位置
int sum = 0;//用于存储数种类减少的个数
for (int i = 0; i < v.size(); i++)
{
if (v[i] < k)
{
k = k - v[i];
++sum;
}
if (v[i] == k)
{
++sum;
k = 0;
break;
}
if (v[i] > k)
{
k = 0;
break;
}
}
cout << "移除后数组中不同整数的最少数目:" <<( v.size() - sum) << endl;
system("pause");
return 0;
}