【LeetCode 热题 100】滑动窗口最大值 / 最小覆盖子串 / 轮转数组 / 缺失的第一个正数

头像
⭐️个人主页:@小羊
⭐️所属专栏:LeetCode 热题 100
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

    • 子串
      • 和为 K 的子数组
      • 滑动窗口最大值
      • 最小覆盖子串
    • 普通数组
      • 最大子数组和
      • 合并区间
      • 轮转数组
      • 除自身以外数组的乘积
      • 缺失的第一个正数


子串

和为 K 的子数组

  • 和为 K 的子数组

在这里插入图片描述

class Solution {
public:int subarraySum(vector<int>& nums, int k) {unordered_map<int, int> hash;hash[0] = 1;int pre = 0, res = 0;for (auto e : nums){pre += e;res += hash[pre - k];hash[pre]++;}return res;}
};

滑动窗口最大值

  • 滑动窗口最大值

在这里插入图片描述

看完这个题很容易想到用优先级队列,但是我写了一半突然意识到,当左侧出窗口时优先级队列好像无法立马找到这个值并删除,所以就放弃了这个想法;
于是就又想到set也能排序,通过 rbegin() 返回最大值对应的迭代器,但是数组中可能会出现重复的数,而set会去重,所以就又想到 multiset,它可以真正意义上的排序。
但是测试了一下发现AC不了,又想到 multiset 虽然不去重,但是 erase 会把所有相同的值都删除,所以这个办法好像又不行;
但是又突然想到之前学习 multiset 的时候测试过不同的 erase 删除,发现传值、传迭代器、传迭代器区间,最后的结果是不同的。其中传值和传迭代器区间会把所有相同的值都删除,而传迭代器的话只会删除一个。
于是又测试了一下,终于过了。但是N*logN的时间负责度居然才击败了百分之5的用户🤡

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;multiset<int> hash;for (int l = 0, r = 0; r < nums.size(); r++) {hash.insert(nums[r]);if (r - l + 1 == k){res.push_back(*hash.rbegin());hash.erase(hash.find(nums[l++]));}}return res;}
};

这位兄弟在官方题解下大彻大悟,我要是有他一半悟性就好了哈哈…
在这里插入图片描述

下面是看了官解才学到的方法,对嘛,用键值对绑定起来不就能找到了。

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;priority_queue<pair<int, int>> pq;for (int i = 0; i < k; i++){pq.emplace(nums[i], i);}res.push_back(pq.top().first);for (int i = k; i < nums.size(); i++){pq.emplace(nums[i], i);while (pq.top().second <= i - k) // 关键 <={pq.pop();} res.push_back(pq.top().first);} return res;}
};

最小覆盖子串

  • 最小覆盖子串

在这里插入图片描述

class Solution {
public:string minWindow(string s, string t) {int hash1[128] = {};int m = s.size(), n = t.size();for (auto ch : t) hash1[ch - 'A']++;int hash2[128] = {};int begin = 0, len = m + 1;for (int l = 0, r = 0, cnt = 0; r < m; r++){int in = s[r] - 'A';if (++hash2[in] <= hash1[in]) cnt++;while (cnt == n){if (r - l + 1 < len){len = r - l + 1;begin = l;}int out = s[l++] - 'A';if (hash2[out]-- <= hash1[out]) cnt--;}}return len > m ? "" : s.substr(begin, len);}
};

普通数组

最大子数组和

  • 最大子数组和

在这里插入图片描述

定义 dp[i] 表示以i位置为结尾的最大子数组,则以i位置为结尾的子数组可以分为两类:i位置元素单独构成子数组,i位置及其之前所有元素构成子数组,则可得状态转移方程:dp[i] = max(dp[i - 1] + nums[i], nums[i]);

class Solution {
public:int maxSubArray(vector<int>& nums) {int res = -0x3f3f3f3f;int n = nums.size();vector<int> dp(n + 1);for (int i = 1; i <= n; i++){dp[i] = max(dp[i - 1] + nums[i - 1], nums[i - 1]);res = max(res, dp[i]);}return res;}
};

空间优化。

class Solution {
public:int maxSubArray(vector<int>& nums) {int res = -0x3f3f3f3f;int pre = 0;for (auto e : nums){pre = max(pre, 0) + e;res = max(res, pre);}return res;}
};

这就是我算法不好的原因吗?
在这里插入图片描述


合并区间

  • 合并区间

在这里插入图片描述

一道区间贪心问题。

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end());vector<vector<int>> res;int l = intervals[0][0], r = intervals[0][1];for (int i = 1; i < intervals.size(); i++){int a = intervals[i][0], b = intervals[i][1];// 当区间重叠时合并两个区间if (a <= r) r = max(r, b);else {// 当区间不重叠时插入res.push_back({l, r});l = a, r = b;}}res.push_back({l, r});return res;}
};

轮转数组

  • 轮转数组

在这里插入图片描述

本题解法:爱滴魔力转圈圈。
我们来观察结果,原数组右边某个区间长度的数都平移到了左边,左边剩余区间长度的数都平移到了右边。那我们把数组反转就可以得到类似的效果,但是此时两部分都是反转的,那我们再对应区间反转即可。

class Solution {
public:void rotate(vector<int>& nums, int k) {k %= nums.size();reverse(nums.begin(), nums.end());reverse(nums.begin(), nums.begin() + k);reverse(nums.begin() + k, nums.end());}
};

除自身以外数组的乘积

  • 除自身以外数组的乘积

在这里插入图片描述

class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size(); vector<int> f(n, 1), g(n, 1), res(n);for (int i = 1; i < n; i++) f[i] = f[i - 1] * nums[i - 1];for (int i = n - 2; i >= 0; i--) g[i] = g[i + 1] * nums[i + 1];for (int i = 0; i < n; i++) res[i] = f[i] * g[i];return res;}
};

缺失的第一个正数

  • 缺失的第一个正数

在这里插入图片描述

这题做的跟吃了蟑螂一样难受。

class Solution {
public:int firstMissingPositive(vector<int>& nums) {int n = nums.size();for (int i = 0; i < n; i++){while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]){swap(nums[nums[i] - 1], nums[i]);}}for (int i = 0; i < n; i++){if (nums[i] != i + 1){return i + 1;}}return n + 1;}
};

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

头像

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

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

相关文章

golang的cgo的一点小心得

最后有个项目需要涉及到cgo&#xff0c;在这块以前用的不多&#xff0c; 这次略微用得深入了一点&#xff0c;记下来几点以备以后使用 本质上cgo去用的时候就是遵守一些ABI而已&#xff0c;总体而言&#xff0c;尽量避免复杂结构的来回传递。1 对于变长参数&#xff0c;只有…

异构网络环境下的切换策略研究

移动互联网应用快速崛起,现有的无线接入技术有,无线局域网(Wireless Local Area NetWork,WLAN),移动蜂窝网络(4G,5G),无线广域网(Wireless Wide Area Network,WWAL)以及卫星通信网络等。多接入技术方便用户通信,还符合多业务场景。这种多无线接入技术共存的网络环…

人工智能赋能美妆零售数字化转型:基于开源AI大模型的S2B2C商城系统构建

摘要 在消费升级背景下&#xff0c;美妆行业正经历从传统卖场向智能体验空间的转型。本文以"未来商店"为研究对象&#xff0c;探讨开源AI大模型与S2B2C商城系统的协同效应&#xff0c;揭示人工智能技术如何重构"人-货-场"关系。通过实证研究发现&#xff…

计算机视觉中的正则化:从理论到实践的全面解析

&#x1f31f; 计算机视觉中的正则化&#xff1a;从理论到实践的全面解析&#x1f31f; 大家好&#xff01;今天要和大家分享的是在计算机视觉&#xff08;CV&#xff09;领域中非常重要的一个概念——正则化&#xff08;Regularization&#xff09;。无论你是刚开始接触深度学…

Linux字符设备驱动开发的详细步骤

1. 确定主设备号​​ ​​手动指定​​&#xff1a;明确设备号时&#xff0c;使用register_chrdev_region()静态申请&#xff08;需确保未被占用&#xff09;。​​动态分配​​&#xff1a;通过alloc_chrdev_region()由内核自动分配主设备号&#xff08;更灵活&#xff0c;推…

软件工程效率优化:一个分层解耦与熵减驱动的系统框架

软件工程效率优化&#xff1a;一个分层解耦与熵减驱动的系统框架** 摘要 (Abstract) 本报告构建了一个全面、深入、分层的软件工程效率优化框架&#xff0c;旨在超越简单的技术罗列&#xff0c;从根本的价值驱动和熵减原理出发&#xff0c;系统性地探讨提升效率的策略与实践。…

【Docker游戏】使用Docker部署vue-XiuXianGame文字修仙小游戏

【Docker游戏】使用Docker部署vue-XiuXianGame文字修仙小游戏 一、vue-XiuXianGame介绍1.1 vue-XiuXianGame简介1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、拉…

用 LangChain 手搓 RAG 系统:从原理到实战

一、RAG 系统简介 在当今信息爆炸的时代&#xff0c;如何高效地从海量数据中获取有价值的信息并生成准确、自然的回答&#xff0c;成为了人工智能领域的重要课题。检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;系统应运而生&#xff0c;…

SpringBoot集成LiteFlow实现轻量级工作流引擎

LiteFlow 是一款专注于逻辑驱动流程编排的轻量级框架&#xff0c;它以组件化方式快速构建和执行业务流程&#xff0c;有效解耦复杂业务逻辑。通过支持热加载规则配置&#xff0c;开发者能够即时调整流程步骤&#xff0c;将复杂的业务如价格计算、下单流程等拆分为独立且可复用的…

38 python random

在实际中,我们常常会用到随机的概念,比如 模拟抽奖活动(如:月度优秀员工抽奖)生成测试数据(如:随机考勤时间、随机销售额)打乱数据顺序(如:随机分配任务到人)Python 的random模块就像你的 "随机事件生成器",帮你轻松创建各种随机数据 一、基础操作:从随…

附赠二张图,阐述我对大模型的生态发展、技术架构认识。

文章精炼&#xff0c;用两张图说明大模型发展业态方向&#xff0c;以及大模型主体技术架构。&#xff08;目前还需要进一步验证我的Thought && ideas&#xff0c;等待机会吧.........&#xff09; 图一&#xff1a;探究大模型三个层次应用方向&#xff0c;浅层次入门简…

2025上海车展 | 移远通信全栈车载智能解决方案重磅亮相,重构“全域智能”出行新范式

2025年4月23日至5月2日&#xff0c;第二十一届上海国际汽车工业展览会在国家会展中心&#xff08;上海&#xff09;盛大启幕。作为车载智能解决方案领域的领军企业&#xff0c;移远通信以“全域智能 驭见未来”为主题&#xff0c;携丰富的车载解决方案及客户终端惊艳亮相8.2馆8…

告别 “幻觉” 回答:RAG 中知识库与生成模型的 7 种对齐策略

一、引言 大语言模型&#xff08;LLM&#xff09;在文本生成领域展现出惊人能力&#xff0c;但 “幻觉” 问题&#xff08;生成虚构或偏离事实的内容&#xff09;始终是落地应用的核心挑战。检索增强生成&#xff08;RAG&#xff09;通过将外部知识库与 LLM 结合&#xff0c;形…

项目笔记2:post请求是什么,还有什么请求

在 HTTP&#xff08;超文本传输协议&#xff09;中&#xff0c;请求方法用于向服务器表明客户端想要执行的操作。POST 请求是其中一种常见的请求方法&#xff0c;此外还有 GET、PUT、DELETE 等多种请求方法&#xff0c;下面为你详细介绍&#xff1a; POST 请求 定义&#xff…

中间系统-邻居建立,数据库同步

ISIS邻居状态&#xff1a; 1、Down&#xff1a;接口一旦启用ISIS协议之后就是Down状态 2、Init&#xff1a;收到了邻居的Hello报文后&#xff0c;发现了邻居。 3、up&#xff1a;收到了邻居的Hello报文&#xff0c;并且在邻居的hello报文中发现了自己。 ISIS邻居建立的条件&…

玩转Docker | Docker部署LMS轻量级音乐工具

玩转Docker | Docker部署LMS轻量级音乐工具 前言一、LMS介绍LMS简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署LMS服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问LMS服务访问LMS首页注册账号五、基本使用上传音乐文…

AR行业应用案例与NXP架构的结合

1. 工业巡检AR头盔 场景示例&#xff1a;宁德核电基地使用AR智能头盔进行设备巡检&#xff0c;通过实时数据叠加和远程指导&#xff0c;将工作效率提升35%。头盔需处理传感器数据、图像渲染和低延迟通信1。 NXP架构支持&#xff1a; 协处理器角色&#xff1a;NXP i.MX RT系列M…

【Harmony OS】组件

目录 组件概述 组件常用属性 系统内置组件 Text TextArea 多行文本输入框组件 TextInput 文本输入框 Button Image 图片组件&#xff0c;支持本地图片和网络图片 Radio 单选框 Checkbox 复选框 Blank 空白填充组件 Divider 分隔符 PatternLock 图案密码锁组件 Prog…

Flutter Dart 集合类型List Set Map详解军 以及循环语句 forEaclh map where any every

List基础用法 var list1 ["西瓜", "苹果", "香蕉", true, 0];var list2 <String>["西瓜", "苹果", "香蕉"];List list3 ["西瓜", "苹果", "香蕉"];list3.add("草莓&…

在网上找的资料怎样打印出来?

在数字化时代&#xff0c;我们经常需要从互联网上获取各种资料&#xff0c;无论是学术论文、工作文档还是学习资料。然而&#xff0c;如何高效地将这些网上的资料打印出来&#xff0c;却是一个值得探讨的问题。本文将为您提供一个全面的解决方案&#xff0c;帮助您轻松完成网上…