有一个数组,要求找出最大的3个数,最小的4个数。
小顶堆,从大到小排序,筛选最小的N个数。
// 创建一个小顶堆 std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;
大顶堆,从小到大排序,筛选最大的N个数。
// 创建一个大顶堆 std::priority_queue<int, std::vector<int>, std::less<int>> max_heap;
小顶堆: 1 / \ 3 2 / \ / \ 7 8 5 4 大顶堆: 8 / \ 7 5 / \ / \ 3 1 2 4
小顶堆和大顶堆都是二叉堆的一种形式,是一种用于实现优先队列的数据结构。它们的区别在于元素的排列方式和根节点的值。
-
小顶堆(Min Heap):在小顶堆中,每个节点的值都小于或等于其子节点的值。换句话说,堆顶元素是最小值,根节点的值小于其左右子节点的值。小顶堆的性质使得堆顶元素是优先级最低的。
-
大顶堆(Max Heap):在大顶堆中,每个节点的值都大于或等于其子节点的值。换句话说,堆顶元素是最大值,根节点的值大于其左右子节点的值。大顶堆的性质使得堆顶元素是优先级最高的。
在小顶堆中,根节点的值最小,且每个节点的值都小于或等于其子节点的值。而在大顶堆中,根节点的值最大,且每个节点的值都大于或等于其子节点的值
#include <iostream> #include <vector> #include <queue> // 定义一个函数来创建小顶堆并筛选出最小的 4 个数 std::vector<int> findFourSmallestNumbers(const std::vector<int>& nums) { // 创建一个小顶堆 std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap; // 将数组中的元素插入到小顶堆中 for (int i = 0; i< nums.size(); ++i) { min_heap.push(nums[i]); } // 从堆中依次取出最小的 4 个数 std::vector<int> result; for (int i = 0; i < 4; ++i) { result.push_back(min_heap.top()); min_heap.pop(); } return result; } // 定义一个函数来创建大顶堆并筛选出最大的 3 个数 std::vector<int> findThreeLargestNumbers(const std::vector<int>& nums) { // 创建一个大顶堆 std::priority_queue<int, std::vector<int>, std::less<int>> max_heap; // 将数组中的元素插入到大顶堆中 for (int i = 0; i < nums.size(); ++i) { max_heap.push(nums[i]); } // 从堆中依次取出最大的 3 个数 std::vector<int> result; for (int i = 0; i < 3; ++i) { result.push_back(max_heap.top()); max_heap.pop(); } return result; } int main() { std::vector<int> nums = {3, 1, 4, 10, 5, 19, 22, 60, 5, 38, 5, 8, 999, 7, 9, 31, 2}; // 找到最小的 4 个数 std::vector<int> fourSmallestNumbers = findFourSmallestNumbers(nums); std::cout << "最小的 4 个数: "; for (int num : fourSmallestNumbers) { std::cout << num << " "; } std::cout << std::endl; // 找到最大的 3 个数 std::vector<int> threeLargestNumbers = findThreeLargestNumbers(nums); std::cout << "最大的 3 个数: "; for (int num : threeLargestNumbers) { std::cout << num << " "; } std::cout << std::endl; return 0; }
from chat-gpt:
#include <iostream> #include <vector> #include <queue> using namespace std; void findLargestAndSmallest(vector<int> &nums) { // Min heap priority_queue<int, vector<int>, greater<int>> minHeap; // Max heap priority_queue<int> maxHeap; // Push all elements to both heaps for (int num : nums) { minHeap.push(num); maxHeap.push(num); } // Find the largest 3 numbers cout << "Largest 3 numbers: "; for (int i = 0; i < 3; ++i) { cout << maxHeap.top() << " "; maxHeap.pop(); } cout << endl; // Find the smallest 4 numbers cout << "Smallest 4 numbers: "; for (int i = 0; i < 4; ++i) { cout << minHeap.top() << " "; minHeap.pop(); } cout << endl; } int main() { // Example array of 20 integers (random) vector<int> nums = {12, 34, 56, 78, 90, 23, 45, 67, 89, 10, 32, 54, 76, 98, 21, 43, 65, 87, 9, 87}; findLargestAndSmallest(nums); return 0; }
标签:std,大顶,nums,--,示例,heap,小顶,节点 From: https://www.cnblogs.com/music-liang/p/18050238