给定一个项目列表及其值。任务是找到具有最高值的前 k 个项目。两个项目可能具有相同的值,在这种情况下,名称在前(按字典顺序)的项目将获得更高的优先级。
例子:
Input: items[] = {Bat, Gloves, Wickets, Ball}, values[] = {100, 50, 200, 100}
k = 2
Output: Wickets Ball
Wickets has the highest value.
Bat, Ball has the same value but Ball comes first lexicographically.
方法:这个问题可以通过根据值贪婪地选择项目来解决。我们将按照值的降序使用项目列表进行排序,如果值相同,项目将按字典顺序升序排序。
我们将以对的形式将数据存储在向量中,并将使用带有布尔比较器函数的内置排序函数,该函数将用于比较两个项目。
下面是上述方法的实现:
// C++ implementation of above approach
#include
using namespace std;
// Boolean Comparator Function
// to compare two pairs of item-value
bool comp(pair A, pair B)
{
// Compare the name if the values are equal
if (A.second == B.second)
return A.first < B.first;
// Else compare values
return A.second > B.second;
}
// Driver code
int main()
{
int k = 2;
int n = 3;
// Store data in a vector of Item-Value Pair
vector > items;
// inserting items-value pairs in the vector
items.push_back(make_pair("Bat", 100));
items.push_back(make_pair("Gloves", 50));
items.push_back(make_pair("Wickets", 200));
items.push_back(make_pair("Ball", 100));
// Sort items using Inbuilt function
sort(items.begin(), items.end(), comp);
// Print top k values
// or if n is less than k
// Print all n items
for (int i = 0; i < min(n, k); ++i) {
cout << items[i].first << '\n';
}
return 0;
}
输出:
Wickets
Ball
时间复杂度: O(NlogN)
进一步优化:我们可以使用堆数据结构进一步优化上述解决方案。请参阅数组中的 k 个最大元素。