代码随想录算法训练营第13天 | 239. 滑动窗口最大值 | 347. 前 K 个高频元素

本文主要是介绍代码随想录算法训练营第13天 | 239. 滑动窗口最大值 | 347. 前 K 个高频元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

239. 滑动窗口最大值

题目链接

题意

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7
示例 2:输入:nums = [1], k = 1
输出:[1]提示:1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length

解1

用栈实现单调栈, 由于需要拷贝, 超时了

/*** Note: The returned array must be malloced, assume caller calls free().*/struct stack{int top;int array[100005];
};int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {struct stack *st = (struct stack *)malloc(sizeof(struct stack));int *ans = (int *)malloc(sizeof(int) * 100005);int idx = 0;memset(ans, 0, sizeof(int) * 100005);memset(st, 0, sizeof(*st));st->top = -1;for (int i = 0; i < k; i++) {while (st->top != -1 && st->array[st->top] < nums[i]) {st->top--;} st->array[++st->top] = nums[i];}ans[idx++] = st->array[0];for (int i = k; i < numsSize; i++) {while (st->top != -1 && st->array[st->top] < nums[i])  st->top--;st->array[++st->top] = nums[i];if (st->array[0] == nums[i-k]) {int j = 0;while (j < st->top) {st->array[j] = st->array[j+1];j++;}st->top--;}ans[idx++] = st->array[0];}*returnSize = idx;return ans;
}

解2: 队列实现单调栈

/*** Note: The returned array must be malloced, assume caller calls free().*/const int max = 1e5+10;
struct queue{int front, back;int array[100005];
};int empty(struct queue *queue) {if (queue->front == queue->back) {return 1;}return 0;
}void push(struct queue *que, int n) {while (!empty(que) && que->array[que->back] < n) {que->back--;}que->array[++que->back] = n;
}void pop(struct queue *que, int n) {if (que->array[que->front+1] == n) {que->front++;}
}int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {struct queue *que = (struct queue *)malloc(sizeof(struct queue));int *ans = (int *)malloc(sizeof(int) * max);int idx = 0;memset(que, 0, sizeof(*que));que->front = que->back = -1;for (int i = 0; i < k; i++) {push(que, nums[i]);}ans[idx++] = que->array[que->front+1];for (int i = k; i < numsSize; i++) {pop(que, nums[i-k]);push(que, nums[i]);ans[idx++] = que->array[que->front+1];}*returnSize = idx;return ans;
}

347. 前 K 个高频元素

题目链接

题意

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:输入: nums = [1], k = 1
输出: [1]提示:1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

小顶堆

class Solution {
public:struct cmp_pair {bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}};vector<int> topKFrequent(vector<int>& nums, int k) {vector<int> ans(k);unordered_map<int, int> map;for (int i = 0; i < nums.size(); i++) {map[nums[i]]++;}priority_queue<pair<int, int>, vector<pair<int, int>>, cmp_pair> pri_que;for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {pri_que.push(*it);if (pri_que.size() > k) {pri_que.pop();}}for (int i = k-1; i >= 0; i--) {ans[i] = pri_que.top().first;pri_que.pop();}return ans;}
};

这篇关于代码随想录算法训练营第13天 | 239. 滑动窗口最大值 | 347. 前 K 个高频元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947428

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息