《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

《算法题讲解指南:优选算法-滑动窗口》--13 水果成篮

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

13 水果成篮

题目链接:

​编辑

题目示例:

解法(滑动窗口):

算法思路:

算法流程:

C++代码演示:方法一(使用容器)

C++代码演示:方法二(用数组模拟哈希表)

算法总结及流程解析:

结束语


13 水果成篮

题目链接:

题目示例:

解法(滑动窗口):

算法思路:

      研究的对象是一段连续的区间,可以使用【滑动窗口】思想来解决问题。

      让滑动窗口满足:窗口内水果的种类只有两种。

      做法:右端水果进入窗口的时候,用哈希表统计这个水果的频次。这个水果进来后,判断哈希表的大小

  • 如果大小超过 2:说明窗口内水果种类超过了两种。那么就从最左侧开始依次将水果划出窗口,直到哈希表的大小小于 2 ,然后更新结果;
  • 如果没有超过 2 ,说明当前窗口内水果的种类不超过两种,直到更新结果 len。
算法流程:

  1.初始化哈希表 hash 来统计窗口内水果的种类和数量;

  2.初始化变量:左右指针 left = 0,right = 0,记录结果的变量 len = 0;

  3.当 right 小于数组大小的时候,一直执行下列循环:

  • 将当前水果放入哈希表
  • 判断当前水果进来后,哈希表的大小:

            如果超过 2:

                        将左侧元素滑出窗口,并且在哈希表中将该元素的频次减一;

                        如果这个元素的频次减一之后变成了 0,就把该元素从哈希表中删除;

                        重复上述两个过程,直到哈希表中的大小不超过 2;

  • 更新结果 len;
  • right++,让下一个元素进入窗口;

  4.循环结束后, len 存的就是最终结果。

C++代码演示:方法一(使用容器)

class Solution { public: int totalFruit(vector<int>& fruits) { //方法一:使用容器(如果对哈希掌握不是很好可以看下面方法二) unordered_map<int ,int> hash; //统计窗口内出现水果的种类 int left = 0; int right = 0; int len = 0; for(right = 0; right < fruits.size(); right++) { hash[fruits[right]]++; //进窗口 while(hash.size() > 2) //判断 { hash[fruits[left]]--; //出窗口 if(hash[fruits[left]] == 0) { hash.erase(fruits[left]); } left++; } len = max(len, right - left + 1); //更新结果 } return len; } };

C++代码演示:方法二(用数组模拟哈希表)

class Solution { public: int totalFruit(vector<int>& fruits) { //方法二:用数组模拟哈希表(只需要了解哈希可以对数据存放的次数进行计数即可) int hash[100001] = { 0 };//根据题目提示可知水果种类最多不超过100000 int left = 0; int right = 0; int len = 0; int kinds = 0; //用一个新变量来维护水果种类 for(right = 0; right < fruits.size(); right++) { if(hash[fruits[right]] == 0) { kinds++; } hash[fruits[right]]++; //进窗口 while(kinds > 2) //判断 { hash[fruits[left]]--; //出窗口 if(hash[fruits[left]] == 0) { kinds--; } left++; } len = max(len, right - left + 1); //更新结果 } return len; } };

算法总结及流程解析:

结束语

       到此,13 水果成篮 这道算法题就讲解完了。通过滑动窗口处理连续区间问题。当窗口内水果种类超过2种时,左指针右移调整窗口,利用哈希表统计频次,最终求出最大区间长度。提供C++两种实现:容器版和数组模拟哈希表版。希望大家能有所收获!

Read more

Gemma 3模型:Google 开源新星,大语言模型未来探索

Gemma 3模型:Google 开源新星,大语言模型未来探索

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、快速发展的AI世界:为何关注Gemma 3? 2、Gemma 模型的背景:Google 的开源承诺 二、Gemma 3 基础:什么是 Gemma? 1、Gemma 模型的诞生和设计理念 2、Gemma 模型的优势与特点 三、Gemma 3 技术深度解析 1、Gemma 3 的架构 2、模型训练与优化 3、不同尺寸 Gemma 模型对比 一、引言 1、快速发展的AI世界:为何关注Gemma

By Ne0inhk

2024最新可用!GitHub/谷歌学术/Sci-Hub镜像站合集(附实测截图)

2024科研与开发者的网络工具箱:实测可用的学术与代码资源镜像指南 作为一名长期在代码与论文之间穿梭的开发者或研究者,你是否也经历过这样的时刻:一个关键的GitHub仓库打不开,无法查阅项目文档;一篇急需的文献在谷歌学术上卡在加载界面;或是Sci-Hub的主域名又一次失联,让你与重要的研究成果失之交臂。网络环境的波动,常常成为我们高效工作的最大障碍。这篇文章,正是为你准备的。它不是一份简单的网址清单,而是一份经过2024年上半年持续实测、对比分析后的动态生存指南。我们将深入探讨这些镜像服务的原理、各自的优劣、使用时的核心注意事项,并提供超越简单访问的进阶技巧。我们的目标,是让你手头始终握有几把可靠的“钥匙”,无论网络风向如何变化,都能顺畅地打开知识宝库的大门。 1. 镜像服务的本质:为什么我们需要它们? 在深入具体网址之前,我们有必要先理解“镜像”究竟是如何工作的。简单来说,镜像站点可以被看作是一个“影子”或“副本”。当原始网站(如 github.com)因为地理距离、网络策略或其他原因导致访问缓慢或不可达时,位于其他网络环境下的服务器会定期(或实时)抓取并同步原始网站的内容,

By Ne0inhk
zoxide 开源鸿蒙 PC 生态适配实战:Rust 交叉编译与 HNP 打包完整指南

zoxide 开源鸿蒙 PC 生态适配实战:Rust 交叉编译与 HNP 打包完整指南

zoxide 开源鸿蒙 PC 生态适配实战:Rust 交叉编译与 HNP 打包完整指南 前言:为什么要把 zoxide 引入开源鸿蒙 PC 生态? 作为 Linux 终端下广受欢迎的智能目录跳转工具,zoxide 凭借关键词模糊匹配 + 访问频率排序的核心优势,彻底解决了传统 cd 命令需记忆冗长路径、逐级跳转的痛点,成为开发者与运维人员提升终端效率的必备工具。随着鸿蒙PC生态的快速发展,终端命令行工具的丰富度成为提升用户体验的关键环节。为让开源鸿蒙 PC 用户也能享受到 zoxide 的高效便捷。 本文基于 Rust 交叉编译技术与开源鸿蒙 HNP 规范,详细拆解 zoxide 从源码拉取、构建脚本配置、交叉编译打包,到设备端安装验证的完整适配流程。文中不仅提供可直接复用的配置文件与命令代码,还汇总了适配过程中常见的 Rust 编译、链接器兼容等问题及解决方案,为开发者提供一套低成本、高可复用的开源鸿蒙

By Ne0inhk
EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT,需要搭建一个MQTT服务器,所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的,在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了,所以便在网上找了很久资源,网上的安装教程都是之前的那种官网截图,所以自己找到了资源以后重新梳理一遍现在的EMQX开源版安装教程。 这里主要演示Linux版本,Windows版本可在这里下载到对应的安装包以后参考以前的资料进行安装及配置。 系统:Ubuntu 22.04LTS 下载 1.首先使用浏览器打开链接: https://www.emqx.com/zh/downloads/broker/ 然后选择自己想要下载的版本,我这里以最新版5.8.6为例,点击5.8.6之后,按照自己的系统等信息选择对应的安装包 例如我这里的系统是amd64的ubuntu22.04所以我选择了: * emqx-5.8.6-ubuntu22.04-amd64.deb 然后去到linux环境下: 使用指令wget + 粘贴 wget https:

By Ne0inhk