【算法】滑动窗口——水果成篮

本篇博客是我对“水果成篮”这道题由暴力解法到滑动窗口思路的具体思路,有需要借鉴即可。

目录

  • 1.题目
  • 2.暴力求解
  • 3.暴力优化
    • 3.1每次right不用回退
    • 3.2有些left长度一定不如前一个,不用走,left不回退
  • 4.滑动窗口算法
  • 5.总结

1.题目

题目链接:LINK

在这里插入图片描述

这道题,题干很长,大概意思是给你一个数组,然后你可以从随便一个数字开始依次遍历,直到遍历结束或者找到超过不同的两个数字,问你最大长度是几。

一般没有经验的人,肯定首先想到的是暴力求解,我也是一样哈,没啥经验。

2.暴力求解

那如何进行暴力求解呢?
暴力求解思路:哈希表 + 依次遍历

思路详解:具体来说,定义两个指针,一个left,一个right,再搞一个哈希表,right指向的数字就丢到哈希表里,计数,然后超过两个或者遍历结束的时候,我们更新一下结果然后left++,right = left,重新计数。然后这堆记的数字取个最大的就行了。

总而言之,代码如下:

class Solution {
public:
//暴力解法:
    int totalFruit(vector<int>& fruits) {
        int n = fruits.size();
        int count = 0;
        int ret = 0;
        int sum = 0;
        for(int left = 0;left < n;left++)
        {
            count = 0;
            sum = 0;
            int hash[100001] = {0};
            for(int right = left;right < n;right++)
            {
                
                //进哈希表
                if(hash[fruits[right]] == 0)//一个新种类的水果
                {
                    hash[fruits[right]]++;
                    count++;
                    sum++;
                }
                else//这里标识之前有过的一个水果
                {
                    hash[fruits[right]]++;
                    sum++;
                }

                if(count > 2)
                {
                     ret = max(ret, sum - 1);break;
                }
               
                if(count <= 2 && right == n - 1)
                {ret = max(ret, sum);break;}
            }
        }

        return ret;
    }
};

然后不出意外哈,力扣绝对过不了,不然这题不会上中等难度了。

然后力扣提示说超出时间限制,比如下图:
在这里插入图片描述

所以说,这道题肯定是可以优化的,那具体怎么优化呢?我们一步一步来。

3.暴力优化

3.1每次right不用回退

这是什么意思呢?如下图所示:
在这里插入图片描述
在left固定的情况下,之后right这个地方数字种类超过2了,那么意思是红色这块区域数字种类个数是2,这时候按照暴力求解的方式,left++,right = left。

但是,我想说绿色的这块区域的数字种类会有可能超过2吗?显然这是不可能的,所以说right压根没有回去的必要。

3.2有些left长度一定不如前一个,不用走,left不回退

再比如说哈,如下图所示:
在这里插入图片描述
left = 2的情况下压根没必要去走好吧~~
在这里插入图片描述

行了,这时候我就发现这个题目经过优化之后满足“滑动窗口”的使用条件,两指针同向且不回退。

4.滑动窗口算法

然后可以直接优化成滑动窗口算法

class Solution 
{
public:
//滑动窗口:
    int totalFruit(vector<int>& fruits) {

        int n = fruits.size(), ret = 0,sum = 0,kands = 0;
        int hash[100001] = {0};//哈希数组

        for(int right = 0, left = 0;right < n;right++)
        {
            //进窗口
            if(hash[fruits[right]] == 0)kands++;//如果这个是一个新来的数,那么就种类++
            hash[fruits[right]]++;    
            sum++; 

            //出窗口
            while(kands > 2)
            {
                hash[fruits[left]]--;
                sum--;
                if(hash[fruits[left]] == 0)kands--;
                left++;
            }
           
           ret = max(ret, sum);
        }

        return ret;
    }
};

5.总结

总结一下这个题,我感觉正常做的话能做出来,也没啥坑,我感觉是属于一个很常规的滑动窗口的题目。


EOF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么用AI软件设计字体

一 工具准备 软件&#xff1a;Adobe illustrator 如下网盘自取 链接&#xff1a;https://pan.baidu.com/s/1hlImpN4QlsSkOLLUxINOGA 提取码&#xff1a;love 安装的时候看不全界面&#xff0c;多按几下tab键就能看到按钮。 直接找一款喜欢的字体修改&#xff0c;字体包如下…

物联网网关制造生产全流程揭秘!

如果您正有开发和定制物联网网关的计划&#xff0c;找一个专业的物联网设备厂商协助您制造生产物联网网关可以节省大量时间和成本&#xff0c;可以让您能专注于当前核心业务&#xff0c;而无需将精力过多地投入到自己不擅长的领域。 当然&#xff0c;了解物联网网关的测试和制…

基于JSP动漫论坛的设计与实现(二)

目录 3. 系统开发环境及技术介绍 3.1 开发环境 3.2 开发工具 3.2.1 MyEclipse8.5 3.2.2 MySql 3.3 相关技术介绍 3.3.1 JSP技术简介 3.3.2 JDBC技术技术简介 3.3.3 MVC模式与Struts框架技术 4. 总体设计 4.1 系统模块总体设计 4.1.1 普通用户模块设计 4…

数据库的使用基础-SQL语句

一、在MYSQL中&#xff0c;创建数据库&#xff0c;语法如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];[ ]中的内容是可选的。语法说明如下&#xff1a; <数据库…

LeetCode738:单调递增的数字

题目描述 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 332 代码 class Solution { public:int monotoneIncreasingDigits(…

Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl

本文首发于公众号&#xff1a;机器感知 Imagine Flash、StyleMamba 、FlexControl、Multi-Scene T2V、TexControl You Only Cache Once: Decoder-Decoder Architectures for Language Models We introduce a decoder-decoder architecture, YOCO, for large language models, …

QT---day4事件

1、思维导图 2、 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include<QIcon> //图标类 #include<QLabel> //标签类 #include<QMovie> //动图类 #include<QLineEdit> //行编辑器类 #include<QPushButton> //按钮…

AJAX知识点(前后端交互技术)

原生AJAX AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML&#xff0c;通过AJAX可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无需刷新就可获取数据。 AJAX不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式 …

【进程等待】阻塞等待 | options非阻塞等待

目录 waitpid 阻塞等待 options&非阻塞等待 pid_t返回值 阻塞等待VS非阻塞等待 waitpid 回顾上篇&#xff1a; pid_ t waitpid(pid_t pid, int *status, int options); 返回值&#xff1a; 当正常返回的时候waitpid返回收集到的子进程的进程ID&#xff1b;如果设置了…

C++容器之vector类

目录 1.vector的介绍及使用1.1vector的介绍1.2vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.4 vector 增删查改1.2.5vector 迭代器失效问题1.2.6 vector 在OJ中的使用。 2.vector深度剖析及模拟实现2.1 std::vector的核心框架接口…

金三银四面试题(二十五):策略模式知多少?

什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在定义一系列算法&#xff0c;将每个算法封装到一个独立的类中&#xff0c;使它们可以互换。策略模式让算法的变化独立于使用它们的客户端&#xff0c;使得客户端可以根据…

车载测试系列:入行车载测试分享

车载测试前景如何&#xff1f; 软件定义汽车时代的发展趋势&#xff0c;随着控制器自主开发力度的加强&#xff0c;作为V流程中必备环节&#xff0c;车载测试工程师岗位需求会越来越多&#xff1b;控制器集成化&#xff0c;功能集成程度越来越高&#xff0c;对于测试工程师的知…

3. 初探MPI——(非阻塞)点对点通信

系列文章目录 初探MPI——MPI简介初探MPI——&#xff08;阻塞&#xff09;点对点通信初探MPI——&#xff08;非阻塞&#xff09;点对点通信初探MPI——集体通信 文章目录 系列文章目录前言一、Non-blocking communications1.1 Block version1.2 Non-blocking version 二、准…

思维导图软件哪个好?盘点这5款好用的工具!

思维导图作为一种有效的思维工具&#xff0c;在日常生活和工作中扮演着越来越重要的角色。无论是学习、工作规划&#xff0c;还是项目管理&#xff0c;思维导图都能帮助我们更好地组织思路&#xff0c;提升工作效率。然而&#xff0c;市面上众多的思维导图软件让人眼花缭乱&…

软件系统工程建设全套资料(交付清单)

软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c…

C++类和对象(4)

目录 1.初始化列表 2.单参数里面的隐式类型转换 3.多参数的隐式类型转换 4.匿名对象 1.初始化列表 &#xff08;1&#xff09;首先看一下初始化列表具体是什么&#xff1f; 这个就是初始化列表的具体形式&#xff0c;对&#xff0c;你没有看错&#xff0c;这个初始化列表里…

python:画折线图

import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 设置新宋体字体的路径 font_path D:/reportlab/simsun/simsun.ttf# 加载新宋体字体 prop FontProperties(fnamefont_path)""" # 读取 xlsx 文件 d…

【投资必看】充电桩加盟合作哪家好,充电桩厂家合作模式一般有哪些?

随着新能源汽车行业的蓬勃发展&#xff0c;充电桩作为关键的基础设施&#xff0c;其市场需求日益增长。对于有意进入这一行业的投资者来说&#xff0c;了解和选择适合的合作模式至关重要。充电桩厂家的合作模式一般有哪些&#xff0c;本文将从设备销售和投资运营两个维度进行讨…

容灾演练双月报|郑大一附院数据级容灾演练切换

了解更多灾备行业动态 守护数字化时代业务连续 目录 CONTENTS 01 灾备法规政策 02 热点安全事件 03 容灾演练典型案例 01 灾备法规政策 3月19日&#xff0c;工信部发布《工业和信息化部办公厅关于做好2024年信息通信业安全生产和网络运行安全工作的通知》。明确提出“…

官宣:vAsterNOS正式发布!开放网络操作系统免费试用!

近期&#xff0c;vAsterNOS&#xff08;设备模拟器&#xff09;正式发布&#xff0c;可以满足用户快速了解 AsterNOS、体验实际操作、搭建模拟网络的需求&#xff0c;可运行在GNS3、EVE-NG等网络虚拟软件中。 AsterNOS 网络操作系统是星融元为人工智能、机器学习、高性能计算、…
最新文章