滑动窗口(二)

news2024/11/15 12:41:52

文章目录

  • Leetcode1658. 将 x 减到 0 的最小操作数
    • 题目
    • 解法(滑动窗口)
  • Leetcode904. 水果成篮
    • 题目
    • 解法(滑动窗口)
  • Leetcode438. 找到字符串中所有字母异位词
    • 题目
    • 解法(滑动窗口)

Leetcode1658. 将 x 减到 0 的最小操作数

题目

Leetcode1658. 将 x 减到 0 的最小操作数

解法(滑动窗口)

题目的意思就是左边或者右边减掉一个数,使减掉的数的和恰好为 x ,我们其实并不能很清楚的知道应该从哪边开始减,这样问题就变得复杂起来。因此,我们对题目进行一个转化,等价为求数组内一段连续的、最长的和为sum(nums) - x的数组

  • 首先转换问题,int target = sum(nums) - x 。特判一下如果target < 0,则无解,这也就意味着我把你数组内的所有元素都减完,我x仍然大于0;
  • 初始化左右指针int left = 0, right = 0
  • right < nums.size()时,一直循环;
    进窗口
    if(t > target), 出窗口

代码

class Solution 
{
public:
    int minOperations(vector<int>& nums, int x) 
    {
        int sum = 0;
        for(auto e:nums) sum += e;//求整个数组的和

        int res = -1;
        int target = sum - x; //转换问题
        if(target < 0) return -1;//特判

        for(int left = 0, right = 0, t = 0; right < nums.size(); right++)
        {
            t += nums[right];//进窗口
            while(t > target)//判断 
                t -= nums[left++];//出窗口
            
            if(t == target) res = max(res, right - left + 1);//更新结构
        }
        return res == -1 ? -1 : nums.size() - res;
    }
};

Leetcode904. 水果成篮

题目

Leetcode904. 水果成篮

解法(滑动窗口)

使窗口内的水果种类只有两种
右端⽔果进⼊窗⼝的时候,⽤哈希表统计这个⽔果出现的次数。这个⽔果进来后,判断哈希表的大小:
如果大于2,说明窗口中水果种类超过两种。那么左侧窗口就依次出水果并更新哈希表内水果种类,直至哈希表大小等于2,那么更新结果;
如果小于等于2,那么直接更新结果;

//使用容器
class Solution 
{
public:
    int totalFruit(vector<int>& fruits) 
    {
        unordered_map<int, int> hash; // 统计窗⼝水果的种类

        int res = 0;
        for(int left = 0, right = 0; right < fruits.size(); right++)
        {
            int in = fruits[right];
            hash[in]++;//进窗口
            while(hash.size() > 2)//判断
            {
                int out = fruits[left];
                hash[out]--;//出窗口

                //当左侧水果种类个数为零的时候,从hash中剔除
                if(hash[out] == 0) hash.erase(out);

                left++;
            }
            res = max(res, right - left + 1);
        }
        return res;
    }
};

在这里插入图片描述

但是使用容器的话,需要不停地在hash中插入数据,这样消耗其实是非常大的,下面我们使用数组模拟hash,这样消耗就会小一点,

//⽤数组模拟哈希表
class Solution 
{
public:
    int totalFruit(vector<int>& fruits) 
    {
        int hash[100001] = {0};//数组模拟哈希表

        int res = 0;
        int kinds = 0;//记录水果的种类
        for(int left = 0, right = 0; right < fruits.size(); right++)
        {
            int in = fruits[right];
            if(hash[in]++ == 0) kinds++;//维护kinds水果种类以及进窗口

            while(kinds > 2)//判断
            {
                int out = fruits[left];
                if(--hash[out] == 0) kinds--;//维护kinds水果种类以及出窗口
                left++;
            }
            res = max(res, right - left + 1);//更新结果
        }
        return res;
    }
};

在这里插入图片描述

Leetcode438. 找到字符串中所有字母异位词

题目

Leetcode438. 找到字符串中所有字母异位词

解法(滑动窗口)

  • 因为字符串 p 的异位词的⻓度⼀定与字符串 p 的⻓度相同,所以我们可以在字符串 s 中构造⼀个⻓度为与字符串 p 的⻓度相同的滑动窗⼝,维护窗口中没中字母出现的次数;
  • 当窗⼝中每种字⺟的数量与字符串 p 中每种字⺟的数量相同时,则说明当前窗⼝为字符串 p 的异位词;
  • 我们使用两个数组来模拟哈希表,⼀个来保存 s 中的⼦串每个字符出现的个数,另⼀个来保存 p 中每⼀个字符出现的个数。
当我们更新结果时,可以对其进行如下优化
进窗口后,if(hash2[in - 'a'] <= hash1[in - 'a']) count++;
出窗口前,if(hash2[out - 'a'] <= hash1[out - 'a']) count--;
当count == p.size()时,更新结果
class Solution 
{
public:
    vector<int> findAnagrams(string s, string p) 
    {
        int hash1[26] = {0};//统计p中每个字母出现的个数
        for(auto e:p) hash1[e - 'a']++;

        vector<int> res;
        int hash2[26] = {0};//统计窗口中每个字符的个数
        for(int left = 0, right = 0, count = 0; right < s.size(); right++)
        {
            char in = s[right];
            hash2[in - 'a']++;//进窗口
            if(hash2[in - 'a'] <= hash1[in - 'a']) count++;//维护count;

            if(right - left + 1 > p.size())//判断
            {
                char out = s[left++];           
                if(hash2[out - 'a'] <= hash1[out - 'a']) count--;//维护count;
                hash2[out - 'a']--//出窗口
            }
            if(count == p.size()) res.push_back(left);
        }
        return res;
    }
};

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

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

相关文章

如何从iPhone15上恢复意外删除的数据文件(备忘录、通讯录、照片等)

您是否正在寻找恢复 Apple 设备上丢失数据的方法&#xff1f;这是最好用的 iPhone 15数据恢复软件的汇总。 iPhone 数据恢复软件允许从Apple 设备中检索丢失或删除的数据。随着越来越依赖智能手机来存储个人和专业信息&#xff0c;数据丢失可能是一种令人沮丧和压力很大的体验…

licheepi nano 从零开始使用sd卡启动

本文目的&#xff1a;licheepi nano从零开始&#xff0c;使用sd卡启动&#xff1b; 某些原因导致需要重新捣鼓uboot&#xff0c;但过程中频繁出错&#xff0c;后悔最初没有记录详细的操作方法&#xff0c;此帖主要为自己出口气&#xff0c;重新记录&#xff1b; 持续完善&#…

CentOS 安装 redis 7.2

nginx官网 https://redis.io/download/ 把鼠标放到这里&#xff0c;复制下载地址 在服务器找个文件夹执行命令 wget https://github.com/redis/redis/archive/7.2.4.tar.gz tar -zxvf 7.2.4.tar.gz make make install 看到这几行就说明安装成功了 不放心的话再查看下b…

Java基础常见面试题总结-并发(一)

线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创建开销大 为什么不受控&#xff1f; 系统资源有限&#xff0c;每个人针对不同业…

【C++】引用与内联

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 引用2.1 引用概念2.2 引用使用场景2.3 引用特性2.4 引用和指针的区别2.5 传值、传引用效率比较2.5.1 值和引用的作为返回值类型的性能比较 3. 内联函数3.1 …

React + SpringBoot + Minio实现文件的预览

思路&#xff1a;后端提供接口&#xff0c;从minio获取文件的预览链接&#xff0c;返回给前端&#xff0c;前端使用组件进行渲染展示 这里我从minio获取文件预览地址用到了一个最近刚开源的项目&#xff0c;挺好用的&#xff0c;大伙可以试试&#xff0c;用法也很简单 官网&am…

【Unity】QFramework通用背包系统优化:TipPanel优化

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第五章时&#xff0c;笔者对物品提示TipPanel界面进行了一些优化。 优化内容包括&#xff1a; 解决闪烁问题跟随鼠标移动自适应界面大小生成位置优化 效果还是蛮丝滑的&#xff1a; 解决闪烁问题 …

Unknown system variable ‘tx_read_only

使用datagrip可以创建成功 但是使用pycharm就会报一个错误“Unknown system variable tx_read_only”

springboot164党员教育和管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

作业2.8

1、选择题 1.1、以下选项中,不能作为合法常量的是 ____B______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____D________。 A) char c1 ‘H’ &#xff1b; B) char c…

第3章 模板

学习目标 了解模板与模板引擎Jinja2&#xff0c;能够复述模板引擎和模板的作用 掌握模板变量的语法&#xff0c;能够在Jinja2模板中定义模板变量 掌握过滤器的使用&#xff0c;能够在Jinja2模板中使用过滤器过滤模板变量保存的数据 掌握选择结构的使用&#xff0c;能够在Jin…

Redis篇之过期淘汰策略

一、数据的过期策略 1.什么是过期策略 Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略&#xff09;。 2.过期策略-惰…

1.3 Verilog 环境搭建详解教程

学习 Verilog 做仿真时&#xff0c;可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE&#xff08;目前已停止更新&#xff09;&#xff0c;VIVADO&#xff1b;因特尔公司的 Quartus II&#xff1b;ASIC 开发环境有 Synopsys 公司的 VCS &#xff1b;很多人也在用 Icarus…

python-自动化篇-办公-一键将word中的表格提取到excel文件中

文章目录 代码 工作中&#xff0c;经常需要将Word文档中的表格粘贴到Excel文件中&#xff0c;以便汇总及分析。一个一个复制粘贴&#xff0c;非常不方便&#xff0c;还是Python自动化操作&#xff0c;省心省力。要求如下图所示&#xff0c;即将word中的所有表格&#xff0c;转存…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

【开源】SpringBoot框架开发大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

vscode无法ssh远程连接到服务器:远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件

vscode无法ssh远程连接到服务器&#xff1a;远程主机可能不符合 glibc 和 libstdc VS Code 服务器的先决条件 今天vscode自动更新后无法连接到远程服务器了&#xff0c;提示"远程主机可能不符合 glibc 和 libstdc VS Code 服务器的先决条件" 并且命令窗口一直显示&qu…

DFS——迭代加深、双向DFS、IDA*

迭代加深 迭代加深主要用于dfs搜索过程中&#xff0c;某条支路特别深&#xff0c;但是答案在特别浅的地方&#xff0c;也即在另一个分支中&#xff0c;但是按照dfs的原理&#xff0c;我们是将这条支路搜完才去搜另一条支路。所以我们就要及时剪枝&#xff0c;而迭代加深算法则…

ZigBee学习——在官方例程上实现串口通信

Z-Stack版本为3.0.2 IAR版本为10.10.1 文章目录 一、添加头文件二、定义接收缓冲区三、编写Uart初始化函数四、编写串口回调函数五、函数声明六、函数调用七、可能遇到的问题(function “halUartInit“ has no prototype) 以下所有操作都是在APP层进行&#xff0c;也就是这个文…

XGB-6: 单调性约束Monotonic Constraints

在建模问题或项目中&#xff0c;通常情况下&#xff0c;可接受模型的函数形式会以某种方式受到约束。这可能是由于业务考虑&#xff0c;或者由于正在研究的科学问题的类型。在某些情况下&#xff0c;如果对真实关系有非常强烈的先验信念&#xff0c;可以使用约束来提高模型的预…