Day11.一刷数据结构算法(C语言版) 239滑动窗口最大值;347前K个高频元素

devtools/2024/10/22 18:42:18/

        今天就两道题,但是有点难,争取理解吧。


一.239滑动窗口最大值

        之前讲的都是栈的应用,这次该是队列的应用了。

        本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。 

        题目链接/文章讲解/视频讲解:代码随想录

        1.思路分析

        本道题的解题思路推荐观看下方视频,然后再对照具体代码进行学习。思路比较复杂,这里就不写文字说明了,还请认真观看视频,方便读懂之后的代码详解。

        单调窗口最值

 

        2.代码详解

int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {int n = numsSize;int queue[n]; //队列int front = 0, rear = -1; //队首 队尾int left = 0, right = 0; //窗口左下标 窗口右下标while (right < n) { //窗口右移至终点while (rear >= front && nums[right] > queue[rear]) rear--; //维护队列的单调性(非递增),即保证队首元素就是当前窗口的最大值queue[++rear] = nums[right++]; //入队下一个窗口可能的最大值if (left + k <= right) { //窗口大小大于kif (nums[left] == queue[front]) front++; //如果最大值已经在窗口的左边,则将它永久出队else nums[left] = queue[front]; //否则记录最大值进原数组中left++; //左框右移}}*returnSize = n - k + 1;return nums; //返回原数组
}

         (代码来自leetcode,具体链接:滑动窗口最大值代码来源)


 二.347前K个高频元素(先挖个坑)

        大/小顶堆的应用, 在C++中就是优先级队列 

        本题是大数据中取前k值 的经典思路,了解想法之后,不算难。

        题目链接/文章讲解/视频讲解:代码随想录

        1.思路分析

        这道题我第一反应是用哈希表统计元素出现次数,然后我在官网上找到了同样也是用哈希表来实现的题解,具体代码我会在下方分享。

        大概思路:

  1. 用哈希表统计每个数对应出现的次数
  2. 创建一个二元组,将统计出来的键值对分别加入二元组中
  3. 对二元组中的出现次数进行降序排序
  4. 取前k个即可

        不过我看大小堆都是用的c++,对于c语言版本的应用,我还没细想,先挖个坑吧。

        2.代码详解

struct HashEntry {int key;int val;UT_hash_handle hh;
};void hashAddItem(struct HashEntry** obj, int key) {struct HashEntry* pEntry = NULL;HASH_FIND_INT(*obj, &key, pEntry);if (pEntry != NULL){pEntry->val++;}else{pEntry = malloc(sizeof(struct HashEntry));pEntry->key = key;pEntry->val = 1;HASH_ADD_INT(*obj, key, pEntry);}}
int temp(const void* a1, const void* b1)
{int* a = *(int**)a1;int* b = *(int**)b1;return  b[1]-a[1];
}int* topKFrequent(int* nums, int numsSize, int k, int* returnSize){struct HashEntry* cnt = NULL;int* res=malloc(sizeof(int)*k);*returnSize=0;for(int i=0;i<numsSize;i++){hashAddItem(&cnt,nums[i]);}struct HashEntry* s;int count=0;for (s = cnt; s != NULL; s = s->hh.next) {count++;}int** que=malloc(sizeof(int*)*count);int n=0;for (s = cnt; s != NULL; s = s->hh.next) {que[n]=malloc(sizeof(int)*2);que[n][0]=s->key;que[n++][1]=s->val;}qsort(que, count, sizeof(int*), temp);for(int i=0;i<k;i++){res[(*returnSize)++]=que[i][0];}return res;
}

        (代码来自leetcode,具体链接:前K个高频元素代码来源)


        今天状态不佳,所以博客写的有点潦草,还请见谅。

        如果你有问题或者有其他想法,欢迎评论区留言,大家可以一起探讨。 

 

        


http://www.ppmy.cn/devtools/6222.html

相关文章

更改ip地址的几种方式有哪些

在数字化时代&#xff0c;IP地址作为网络设备的标识&#xff0c;对于我们在网络世界中的活动至关重要。然而&#xff0c;出于多种原因&#xff0c;如保护隐私、访问特定网站或进行网络测试&#xff0c;我们可能需要更改IP地址。虎观代理将详细介绍IP地址的更改方法与步骤&#…

Spring Boot集成atomikos快速入门Demo

1.什么是atomikos Atomikos是一个轻量级的分布式事务管理器&#xff0c;实现了Java Transaction API (JTA)规范&#xff0c;可以很方便的和Spring Boot集成&#xff0c;支持微服务场景下跨节点的全局事务。Atomikos公司官方网址为&#xff1a;https://www.atomikos.com/。其旗下…

C++恶魔轮盘赌(道具版)

家人们&#xff0c;更新了昂&#xff0c;前文&#xff1a;来自阳了个阳C的恶魔轮盘赌无道具版 作为阳了个阳C的好同学&#xff0c;我光荣地揽下了道具版的重担 不多说话&#xff0c;直接上代码 #include<bits/stdc.h> #include<Windows.h> typedef long long ll…

Android 单一音量控制

1、关闭/开启单一音量控制 frameworks/base/core/res/res/values/config.xml <!-- Flag indicating whether all audio streams should be mapped toone single stream. If true, all audio streams are mapped toSTREAM_MUSIC as if its on TV platform. --><bool n…

Unity实现动态数字变化

最近的项目需要动态显示数字&#xff0c;所以使用Text组件&#xff0c;将数字进行变化操作过程记录下来。 一、UI准备 1、新建一个Text组件 2、新建C#脚本 3、将Text挂载到脚本上 二、函数说明 1、NumberChange 方法 NumberChange 方法接收四个参数&#xff1a;初始数字 in…

【WebLogic】Oracle发布2024年第二季度中间件安全公告

Oracle于美国时间2024年4月16日发布了 WebLogic 中间件2024年第二季度的安全公告&#xff0c;涉及漏洞共计 10 个&#xff0c;涉及示例程序的高危漏洞 1 个&#xff0c;中危漏洞中有3个涉及到核心组件&#xff08;Core&#xff09;。 此外&#xff0c;Oracle JDK1.8 的小版本号…

分布式限流——Redis + Lua实现滑动窗口算法

Zset&#xff08;有序集合&#xff09;在Redis中用来实现滑动窗口限流的主要思路是利用其自动排序和可过期成员的特点&#xff1a; 初始化及数据结构选择&#xff1a; 为需要限流的接口或服务创建一个唯一的键&#xff08;key&#xff09;对应一个Zset。Zset中的每个成员通常是…

解读神秘的华为昇腾910

硬件系列的第5篇了 上一篇Microsoft Maia (qq.com) 上上篇Google的TPU (qq.com) 上上上篇怎么看待Groq (qq.com) 上上上上篇