创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
priority_queue
优先级队列(priority_queue)即堆(heap),内部可以看作是一颗完全二叉树
分为大根堆和小根堆,父节点均大于孩子节点是大根堆,父节点均小于孩子节点是小根堆
优先级队列能够每次将优先级最大的元素拿出,然后自动调整堆的结构
#include <queue>
//存储int型元素的大顶堆
std::priority_queue<int> pq;
//存储int型,队列底层vector,大顶堆
std::priority_queue<int,std::vector<int>,std::less<int>> pq;
//存储int型,队列底层vector,小顶堆
std::priority_queue<int,std::vector<int>,std::greater<int>> pq;
//插入元素num
pq.push(num);
//删除堆顶(优先级最高)的元素
pq.pop();
//获取元素个数
pq.size();
//获取堆顶元素
pq.top();
//优先级队列是否为空
pq.empty();
堆排序
使用数组模拟完全二叉树,左孩子节点为 2n+1,右孩子结点为 2n+2
堆排序的核心思想:
- 首先将数组构建成一个最大堆(最小堆)
- 然后将堆顶元素与数组的末尾元素交换
- 调整剩余元素为最大堆(最小堆)
- 重复上述步骤,直到整个数组排序完成
void Adjust(int arr[],int nLength,int nRootID)
{
//调整堆顶
int MAX; // 孩子中的大值
for (MAX = 2 * nRootID + 1; MAX < nLength; MAX = (2 * nRootID + 1))
{
//两个孩子
if(2 * nRootID + 2 < nLength)
{
//找到两个孩子里的大值
if(arr[MAX] < arr[RIGHT])
{
MAX = 2 * nRootID + 2;
}
}
//比较
if(arr[nRootID] < arr[MAX])
{
//交换
arr[nRootID] = arr[nRootID] ^arr[MAX];
arr[MAX] = arr[nRootID] ^ arr[MAX];
arr[nRootID] = arr[nRootID] ^ arr[MAX];
//调整位置交换,MAX位置成为新的调整节点
nRootID = MAX;
}
else
{
//直到父亲比孩子小
break;
}
}
}
void HeapSort(int arr[], int len)
{
if (arr == NULL || len <= 0) return;
//建初始堆
//依次调整各个父节点
for (int i = len / 2 - 1; i >= 0;i--)
{
Adjust(arr, len, i);
}
//排序:将堆顶(最大)与最小交换
for (int i = len - 1; i > 0;i--)
{
//交换
swap(arr[i],arr[0]);
//调整堆顶
Adjust(arr, i, 0);
}
}
堆排序的平均时间复杂度为O(nlogn)
数组中第 K 个最大元素
LeetCode.215. 数组中的第K个最大元素 - 力扣(LeetCode)
给定整数数组 nums
和整数 k
,请返回数组中第 **k**
个最大的元素。
请注意,你需要找的是数组排序后的第 k
个最大的元素,而不是第 k
个不同的元素。
你必须设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
使用优先队列解决
构造最大堆,弹出前k-1
个最大值,返回第k
个最大值,即top()
元素
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int size = nums.size();
priority_queue<int,vector<int>,less<int>> pq;
for(auto num:nums)
{
pq.push(num);
}
for(int i=0;i<k-1;i++)
{
pq.pop();
}
return pq.top();
}
};
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |