首页 > 其他分享 >2023年11月第四周总结

2023年11月第四周总结

时间:2023-11-26 23:22:18浏览次数:54  
标签:11 总结 index int 孩子 2023 大根堆 节点 left

堆是一种完全二叉树,也是一种优先级队列堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。

写了一道可以用堆这种数据结构求解的题目,即找数组中第k大的数,要求时间复杂度为O(N)。

力扣题目链接

解题思路

  1. 根据堆的定义我们可以知道,这道题用大根堆做是比较合适的。因为堆中它的每一颗子树父节点的是最大的,那么堆顶的元素一定是整个数组里面最大的元素,也就是二叉树的根。那么我们要求出第k个大的元素,就只要先把数组先初始化成一个大根堆,再取出k - 1个堆顶的元素,取出的过程仍然保持成一个大根堆就行了,那么取完之后堆顶的元素就是我们要的结果。

代码实现

void swap(int *a, int i, int j)//交换数组中i和j位置的值
{
	int t = a[i];
	a[i] = a[j];
	a[j] = t;
}
void heapinsert(int *a, int index) {//将index下标的数插入到a数组里面并仍然让a数组保持是一个大根堆
    while(index >= 0 && a[index] > a[(index - 1) / 2]) {//插入的数比它的父亲节点的值要大,那么它就要交换,因为只有这样才是大根堆
        swap(a,index, (index - 1) / 2);//和父亲节点的值做交换
        index = (index - 1) / 2;//下标的值变成父亲节点的下标,因为已经交换过了,所以更新下标
    }
}
void heapify(int *a, int index, int heapSize)
{
	int left = 2 *index + 1;//当前下标的左孩子
	
	while(left < heapSize)//只要还有孩子,就继续堆化,即让数组a保持成一个大根堆。
                            //如果没有左孩子,那么就肯定没有右孩子,所以不用继续了,也就是没有孩子了
	{
		int largest = left + 1 < heapSize && a[left + 1] > a[left]? left + 1: left;//指向最大的节点
        //如果有右孩子,并且左孩子的值大于右孩子的值,那么左孩子就是两个孩子节点中最大的节点
        //如果没有右孩子,那么左孩子就是最大的,因为没有右孩子了
        //如果有右孩子,但右孩子的值比左孩子的值大,那么右孩子就是两个孩子节点中最大的节点
		
		largest = a[largest] > a[index]? largest:index;
        //如果两个孩子中节点值最大的值大于index这个下标的值,那么最大的节点还是它本身,否则是index
        
		if (largest == index) {//如果最大节点是index,那么代表它已经是一个大根堆了,跳出循环
			break;
		}
		
		swap(a, largest, index);//和最大的节点交换
		index = largest;//index往后面走,继续找,直到index的值比两个孩子节点的值要大。
		left = index * 2 + 1;//更新左孩子的下标
	}
}
int findKthLargest(int* nums, int numsSize, int k) {
    int heapSize = numsSize;

    for (int i = 0; i < numsSize; i++) {
        heapinsert(nums, i);//把数组初始化成为一个大根堆
    }
		
	while(--k){//执行k - 1次把堆顶元素移除
		swap(nums, 0, --heapSize);//移除堆顶元素
		heapify(nums, 0, heapSize);//让移除之后的数组仍然是一个大根堆
	}
    
    return nums[0];//返回堆顶元素,即第k大的数
}

标签:11,总结,index,int,孩子,2023,大根堆,节点,left
From: https://www.cnblogs.com/lwj1239/p/17852650.html

相关文章

  • 每日总结
    今天是星期天,写了一下大数据的作业和软件构造的作业。 packagecom.example.test;importjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.List;importjava.util.Random;publicclassT......
  • 2023-2024-1 20231309 《计算机基础与程序设计》第九周学习总结
    2023-2024-120231309《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第九周作业这个作业的目标作业正文2023-2024-120231309《计算机基础与程......
  • 【11月LeetCode组队打卡】Task5--UnionFind
    并查集UnionFind一种树型的数据结构,用于处理一些不交集(DisjointSets)的合并及查询问题联通子图最小生成树Kruskal算法最近公共祖先LCA不交集:没有重复元素的集合合并Union:二变一查询Find:确定元素所属集合,通常返回集合内的一个代表元素实现思路基于数组......
  • 2023-2024-1 20231415 《计算机基础与程序设计》第九周学习总结
    这个作业属于哪个课程 这个作业要求在哪里 作业目标 作业正文 教材内容总结《计算机科学概论》第十章操作系统操作系统的角色与构成进程管理先到先服务FCFS最短作业优先轮询法内存管理单块内存管理分区内存管理页式内存管理CPU调用先到先服务FCFS最短作......
  • # 2023-2024-1 20231322 《计算机基础与程序设计》第九周学习总结
    |2022-2023-1-计算机基础与程序设计)||--|--||2022-2023-1计算机基础与程序设计第九周作业||这个作业的目标|总结本周学习成果及疑问||作业正文|(https://www.cnblogs.com/cjl03/p/17858148.html)|教材学习内容总结操作系统责任,内存与进程管理,分时系统,CPU调度,文件、文件系统,......
  • 2023-2024 20231404高伟光《计算机基础与程序设计》第九周学习总结
    作业信息作业内容我的班级我的班级作业要求第八周要求作业目标操作系统责任,内存与进程管理,分时系统,CPU调度,文件、文件系统,文件保护,磁盘调度作业正文此博客教材内容总结c语言程序设计第八章介绍了数组的一系列用法定义,介绍了经典的排序和查找算法,比......
  • 2023-2024-1 20232421邓锴 《网络空间安全导论》 第3周学习总结
    教材学习总结了解网络安全遭受的威胁以及各种攻击手段的基本逻辑了解当前网络安全的现状以及发展原因了解当前为维护网络安全所产生的网络安全防护技术从法律、管理层面认识网络安全从计算机系统(硬件系统、操作系统、数据库系统、应用系统)层面认识网络安全教材学习中的问......
  • linux11.22课堂随笔
    第六章I/O重定向与管道6.1I/O重定向1.可以打开多个终端在终端界面输入tty查看终端编号2.输入date命令显示时间在date后面加>符号并指向date.txt文件那么结果就会写入date.txt文件3.在执行passwd命令改密码时系统会产生一个进程psaux|greppasswd可以查看PID4.ll/p......
  • 2023-2024-1 20231323《计算机基础与程序设计》第九周学习总结
    2023-2024-120231323《计算机基础与程序设计》第9周学习总结作业信息所属课程2023-2024-1-计算机基础与程序设计作业要求在哪里2023-2024-1计算机基础与程序设计第九周作业作业目标学习《计算机科学概论》第10,11章,《C语言程序设计》第8章并完成云班课测试作业......
  • #2023-2024-1 20231408《计算机基础与程序设计》第九周学习总结
    作业信息这个作业属于哪个课程<2023-2024-1-计算机基础与程序设计>这个作业要求在哪里<2023-2024-1计算机基础与程序设计第九周作业>这个作业的目标<《计算机科学概论》第十,十一章,《C语言程序设计》第八章,上周测试题>作业正文https://www.cnblogs.com/jfxyh06......