C语言 | Leetcode C语言题解之第480题滑动窗口中位数

题目:

题解:

struct Heap {int* heap;int heapSize;int realSize;bool (*cmp)(int, int);
};void init(struct Heap* obj, int n, bool (*cmp)(int, int)) {obj->heap = malloc(sizeof(int) * (n + 1));obj->heapSize = 0;obj->cmp = cmp;
}bool cmp1(int a, int b) {return a < b;
}bool cmp2(int a, int b) {return a > b;
}void swap(int* a, int* b) {int tmp = *a;*a = *b, *b = tmp;
}void push(struct Heap* obj, int x) {int p = ++(obj->heapSize), q = p >> 1;obj->heap[p] = x;while (q) {if (!obj->cmp(obj->heap[q], obj->heap[p])) {break;}swap(&(obj->heap[q]), &(obj->heap[p]));p = q, q = p >> 1;}
}void pop(struct Heap* obj) {swap(&(obj->heap[1]), &(obj->heap[(obj->heapSize)--]));int p = 1, q = p << 1;while (q <= obj->heapSize) {if (q + 1 <= obj->heapSize) {if (obj->cmp(obj->heap[q], obj->heap[q + 1])) {q++;}}if (!obj->cmp(obj->heap[p], obj->heap[q])) {break;}swap(&(obj->heap[q]), &(obj->heap[p]));p = q, q = p << 1;}
}int top(struct Heap* obj) {return obj->heap[1];
}bool empty(struct Heap* obj) {return obj->heapSize == 0;
}struct HashTable {int key;int val;UT_hash_handle hh;
} * hashtable;void prune(struct Heap* obj) {while (!empty(obj)) {int num = top(obj);struct HashTable* tmp;HASH_FIND_INT(hashtable, &num, tmp);if (tmp == NULL) {break;}tmp->val--;if (!(tmp->val)) {HASH_DEL(hashtable, tmp);free(tmp);}pop(obj);}
}void makeBalance(struct Heap* small, struct Heap* large) {if (small->realSize > large->realSize + 1) {push(large, top(small));pop(small);--(small->realSize);++(large->realSize);prune(small);} else if (small->realSize < large->realSize) {push(small, top(large));pop(large);++(small->realSize);--(large->realSize);prune(large);}
}void insert(struct Heap* small, struct Heap* large, int num) {if (empty(small) || num <= top(small)) {push(small, num);++(small->realSize);} else {push(large, num);++(large->realSize);}makeBalance(small, large);
}void erase(struct Heap* small, struct Heap* large, int num) {struct HashTable* tmp;HASH_FIND_INT(hashtable, &num, tmp);if (tmp == NULL) {tmp = malloc(sizeof(struct HashTable));tmp->key = num;tmp->val = 1;HASH_ADD_INT(hashtable, key, tmp);} else {tmp->val++;}if (num <= top(small)) {--(small->realSize);if (num == top(small)) {prune(small);}} else {--(large->realSize);if (num == top(large)) {prune(large);}}makeBalance(small, large);
}double getMedian(struct Heap* small, struct Heap* large, int k) {return (k & 1) ? top(small) : (((double)top(small) + top(large)) / 2);
}double* medianSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {hashtable = NULL;struct Heap* small = malloc(sizeof(struct Heap));init(small, numsSize, cmp1);struct Heap* large = malloc(sizeof(struct Heap));init(large, numsSize, cmp2);for (int i = 0; i < k; ++i) {insert(small, large, nums[i]);}double* ans = malloc(sizeof(double) * (numsSize - k + 1));*returnSize = 0;ans[(*returnSize)++] = getMedian(small, large, k);for (int i = k; i < numsSize; ++i) {insert(small, large, nums[i]);erase(small, large, nums[i - k]);ans[(*returnSize)++] = getMedian(small, large, k);}return ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二十二篇——菲欧几何:相对论的数学基础是什么?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 对于几何的几个工具&#xff0c;让我再次感叹数学的伟大&#xff0c;逻辑…

国产大模型基础能力大比拼 - 计数:通义千文 vs 文心一言 vs 智谱 vs 讯飞-正经应用场景的 LLM 逻辑测试

在大语言模型&#xff08;LLM&#xff09;不断涌现的时代&#xff0c;如何评估这些国产大模型的逻辑推理能力&#xff0c;尤其是在处理基础计数问题上的表现&#xff0c;成为了一个备受关注的话题。随着越来越多的国产大模型进入市场&#xff0c;比较它们在不同任务中的表现尤为…

STM32笔记(1)GPIO之点亮LED

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 总结 第一步&#xff1a;先看原理图。PB0输出高电平是&#xff0c;LED1点亮。 初始化完成了两项工作&#xff1a; (1)从时钟上启动所用GPIO所在的总线&#xff1b…

Centos7 安装升级最新版Redis7.4.1

1. 前言 今天阿里云云盾检测出一个redis低版本的漏洞,需要升级到稳定高版本修复漏洞,升级过程遇到了一些坑,特记录分享给大家,原服务器默认yum源安装的gcc 是4.8.5 ,默认安装redis是 3.2.12(如下图): 2.升级GCC 升级新版redis需要更高级的gcc支持,这里我们就选择升级…

《计算机视觉》—— 换脸

效果如下&#xff1a; 完整代码&#xff1a; import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…

力扣 中等 82.删除排序链表中的重复元素 II

文章目录 题目介绍题解 题目介绍 题解 只需在83题基础上加一个while循环即可 class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode dummy new ListNode(101, head);ListNode cur dummy;while (cur.next ! null && cur.next.next ! null) {…

【Linux】Anaconda下载安装配置Pytorch安装配置(保姆级)

目录 Anaconda下载 Anaconda安装 conda init conda --v Conda 配置 conda 环境创建 conda info --envs conda list Pytorch安装配置 检验安装情况 检验是否可以使用GPU Anaconda下载 可以通过两种途径完成Anaconda安装包的下载 途径一&#xff1a;本地windows下…

运算放大器的带宽

运算放大器&#xff08;Op-Amp&#xff09;的带宽是指放大器能够稳定放大信号而不发生增益衰减的最高频率范围。带宽通常定义为放大器增益下降3分贝&#xff08;dB&#xff09;时对应的频率&#xff0c;这个点也被称为-3dB点&#xff08;下图中是蓝色方框圈出的点&#xff09;。…

读数据工程之道:设计和构建健壮的数据系统13无服务器

1. 无服务器 1.1. 云供应商的一个大趋势是无服务器&#xff0c;允许开发人员和数据工程师无须在后台管理服务器即可运行应用程序 1.1.1. 无服务器快速将价值投入到其正确的用例 1.2. 无服务器真正开始流行是在2014年AWS Lambda全面投入使用…

C++ —— 类和对象

目录 介绍类和对象 一. 类和对象——类的定义 1.访问限定符 2.类域 作用操作符:: 3.对象大小 类的实例化 内存对齐规则 4.this指针 this指针会出现的问题 5.C语言结构体与C类对比 封装的本质 C类的优点 二 .类和对象——关于成员 1.类的默认成员函数 I.构造函数 构…

SpringBoot+Vue+Uniapp智能社区服务小程序系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

三菱FX3U-4AD模块怎样读出模拟量数据的?

关于使用FX3U-4AD读出模拟量数据时&#xff0c;所需的最低限度的程序&#xff0c;就此进行说明。读出模拟量数据的步骤如下所示&#xff1a; 1、确认单元号 从左侧的特殊功能单元/模块开始&#xff0c;依次分配单元号0~7。连接在FX3UC-32MT-LT(-2)可编程控制器上时&#xff0c…

ubuntu24.0离线安装Ollama和纯cpu版本以及对接Spring AI

文章目录 一.官网下载 0.3.13版本二.将文件包上传至ubuntu服务器三.下载安装脚本四.剔除GPU相关下载ROCM等&#xff0c;纯CPU运行脚本五.ollama常用命令六. 远程测试 七.对接spring AI 一.官网下载 0.3.13版本 ollama离线安装包下载地址 二.将文件包上传至ubuntu服务器 三.下…

电感电容谐振原理及Matlab仿真

一、电感电容谐振原理概述 电感电容谐振&#xff08;LC谐振&#xff09;是一种电路现象&#xff0c;它发生在电感器&#xff08;L&#xff09;和电容器&#xff08;C&#xff09;通过适当的方式连接时&#xff0c;电路中电流和电压之间形成共振。在这种共振状态下&#xff0c;…

计算机组成原理与系统结构——外部存储器

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 磁盘 磁盘是一个由非磁性材料构成的圆形盘片&#xff08;称为基片&#xff09;&#xff0c;上面涂抹可磁化材料。传统的基片一直是铝制或铝合金的&#xff0…

基于SpringBoot+Vue+Uniapp汽车保养系统小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而…

linux下使用VSCODE 调试python

文章目录 一、环境准备安装VS Code&#xff1a;安装Python&#xff1a; 二、环境测试创建Python文件&#xff1a;编写测试代码运行 Linux下使用VS Code调试Python 在Linux环境中进行Python开发时&#xff0c;一个高效、直观的调试工具是必不可少的。Visual Studio Code&#xf…

2024.10月18日- Vue2组件开发(3)

Vue组件开发 一、 ref属性 如果在vue里&#xff0c;想要获取DOM对象&#xff0c;并且不想使用JS的原生语法&#xff0c;那么就可以使用ref属性。ref属性的用法&#xff1a; 1&#xff09;在HTML元素的开始标记中&#xff0c;或者在Vue子组件中的开始标记中定义&#xff0c;相…

第 5 章:vuex

1. 理解 vuex vuex 是什么&#xff1a; 概念&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&am…

ant design vue TimePicker时间选择器不点击确认也可以设置值

文章目录 前言一、背景二、操作步骤1.复现前的准备工作&#xff08;1&#xff09;vue版本和ant design vue 版本&#xff08;2&#xff09;任意ant design vue TimePicker的demo 2.解决问题&#xff08;1&#xff09;使用change时间&#xff08;无效&#xff09;&#xff08;2&…