【leetcode】将x减到0的最小操作数/水果成篮/找到字符串中所有字母异位词{史上最容易懂的解析}

文章目录

  • 1.将x减到0的最小操作数
  • 2.水果成篮
  • 3.找到字符串中所有字母异位词

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

在这里插入图片描述
在这里插入图片描述

分析题目

x不断地减去数组两端的值 看能否减到0;是不是就是在问:nums数组中存不存在【左端+右端】组成的连续区间,区间上数的和为x 继续分析 ==》 是不是就是在问:nums数组中存不存在内部的一段连续区间,区间上的数的和为sum(nums) - x 很明显,这是个经过分析的【滑动窗口】问题

代码

class Solution
{
public:int minOperations(vector<int> &nums, int x){int sum = 0;for (int a : nums)sum += a;int target = sum - x;//x比sum大 sum中就不会存在几个数的和==xif (target < 0)return -1;int ret = -1;for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++){tmp += nums[right];     while (tmp > target)     tmp -= nums[left++]; if (tmp == target)       ret = max(ret, right - left + 1);}if (ret == -1)return ret;elsereturn nums.size() - ret;}
};

2.水果成篮

在这里插入图片描述
在这里插入图片描述

分析

依旧是滑动窗口,一个区间,该区间内水果种类不能超2,超2就将下一个元素作为区间的起始位置

代码

class Solution
{
public:int totalFruit(vector<int> &f){// i是树的下标 fruits[i]是水果的种类编号 fruits[i]: 0~100000int hash[100001] = {0}; // 以水果的种类编号作hash的下标 对应值记录该种水果出现次数int ret = 0;for (int left = 0, right = 0, kinds = 0; right < f.size(); right++){// 当前遍历的该水果在篮子里的次数是0 种类++if (hash[f[right]] == 0)kinds++;// 当前遍历的该水果可以出现在篮子里hash[f[right]]++;while (kinds > 2){// left作起始位置的这个区间已达最大长度 继续遍历 将下一个元素作为区间的起始位置hash[f[left]]--;        // 出窗口 水果次数--if (hash[f[left]] == 0) // 如果拿出窗口的水果在原来的篮子里是独苗 种类也--kinds--;left++; // 继续下一个元素作为区间的起始位置}ret = max(ret, right - left + 1);}return ret;}
};

cpp_stl容器unordered_map

class Solution
{
public:int totalFruit(vector<int> &f){unordered_map<int, int> hash; int ret = 0;for (int left = 0, right = 0; right < f.size(); right++){hash[f[right]]++;      while (hash.size() > 2) {hash[f[left]]--;if (hash[f[left]] == 0)hash.erase(f[left]);left++;}ret = max(ret, right - left + 1);}return ret;}
};

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

在这里插入图片描述

在这里插入图片描述

滑动窗口的分类

  1. 区间长度固定如本题
  2. 左指针疯狂右移 right不动
  3. 右指针疯狂右移 left不动

总体思路:这道题【维护窗口的时机】发生在窗口的长度超过了p的长度,保证窗口的长度只能不大于p的长度

遍历母串,遍历到who,不管符不符合条件,who就先进窗口,如果who是一个【有效字符】即【可以作为异位词的字符】即【在p中出现且次数不超过在p中出现的字符】,接着上一句,如果who是一个【有效字符】,那么有效字符个数validChar++; 经过不断遍历,如果窗口的长度已经大于p的长度,窗口就要右移了,即left++; 并且left在窗口中的次数也要winHash[out - 'a']--; 需要注意的是,如果移出去的left,他对应的值在窗口中出现的次数大于在p中出现的次数,left移出后,有效字符个数不变,left出去正是我们想要的,这个操作表明窗口中少了一个不该出现的字符,这使得区间中的字符越来越接近我们想要的字符组合即异位词。上述操作保证了窗口的长度只能不大于p的长度。接着再判断,如果此时窗口中的有效字符个数 == p的长度,表示我们找了“异位词”。如果此时validChar != pLen 表示: 虽然窗口的长度到达了pLen,但是窗口中的字符并不是全部有效,还要继续添加新元素,来满足:窗口的长度为pLen且均为有效字符。

代码 + 史上最全解析

class Solution
{
public:vector<int> findAnagrams(string s, string p){vector<int> ret;int sLen = s.size(), pLen = p.size(), validChar;// 母串长度比子串长度还小 直接返回if (sLen < pLen)return ret;// p字符串有哪些字符 分别出现了多少次// phash中值不为0的下标代表有哪些字符 值就是它出现的次数int pHash[26] = {0};for (auto ch : p)pHash[ch - 'a']++;// 记录窗口中有哪些字符以及对应出现的次数int winHash[26] = {0};// 要理解这种写法 要理解两个关键字// 1. winHash  :窗口中有哪些字符以及对应出现的次数// 2. validChar:窗口中有效字符的个数for (int left = 0, right = 0, validChar = 0; right < s.size(); right++){// in:即将进入窗口的字符char in = s[right];// 遍历到in了 in默认进窗口 用【in在窗口中的次数++】来表征in进窗口了// 如果此时窗口中in的次数大于p中in的次数 那么in是作为一个无效字符进的窗口 有效字符个数不变// 如果此时窗口中in的次数不大于p中in的次数 表明in此时在窗口中是一个有效字符 有效字符个数++if (++winHash[in - 'a'] <= pHash[in - 'a'])validChar++;// 窗口的长度已经大于子串了if (right - left + 1 > pLen){char out = s[left++];// out在窗口中出现的次数 <= out在p中出现的次数 有效字符个数--// 反向理解// 如果out在窗口中出现的次数 > out在p中出现的次数// out移出后 有效字符个数不变 out出去正是我们想要的 窗口中少了一个不该出现的字符// 这使得区间中的字符越来越接近我们想要的字符组合了即异位词if (winHash[out - 'a']-- <= pHash[out - 'a'])validChar--;}// 前面两个if保证窗口的窗口不会超过p的长度// 如果此时validChar == pLen即窗口中的有效字符个数等于p的长度 表示我们找了“异位词”// 如果此时validChar != pLen 表示: 虽然窗口的长度到达了pLen 但是窗口中的字符并不是全部有效// 还要继续添加新元素 来满足:窗口的长度为pLen且均为有效字符if (validChar == pLen)ret.push_back(left);}return ret;}
};

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

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

相关文章

【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型

凌波微步 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1 秒&#xff0c;其他语言 2 秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言 65536K 64bit IO Format: %lld 题目描述 小 Z 的体型实在是太胖了&…

小程序如何通过公众号发送新订单提醒

当客户在小程序上下单后&#xff0c;公众号会发送订单通知&#xff0c;这可以让管理员及时获知用户下单情况&#xff0c;方便及时处理订单和提供服务。下面是具体介绍如何设置公众号来发送订单服务通知。 方式一&#xff1a;通过采云公众号发送订单通知 此种方式是默认的通知…

vulhub打靶记录——Corrosion2

文章目录 主机发现端口扫描ssh—22search openssh EXP web服务—8080目录扫描登录tomcat后台 提权切换用户查看用户权限寻找SUID命令破解登录密文 总结 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; nmap -sP 192.168.151.0/24192.168.151.1&am…

投资回报率ROI是什么意思?

投资回报率&#xff08;Return on Investment&#xff09;是判断公司经营活动中所使用的资本带来的真实利润高低的指标&#xff0c;它涵盖了企业的获利目标。 名词解释 投资回报率 Return on Investment 是判断公司经营活动中所使用的资本带来的真实利润高低的指标&#xff0…

真实对比kimi、通义千问、文心一言的写代码能力,到底谁强?

&#x1f916;AI改变生活&#xff1a;最近都在说月之暗面的kimi的各项能力吊打国内其他大模型&#xff0c;今天我们真实感受下 kimi、通义千问、文心一言的根据需求写代码的能力。 测评结果让人震惊&#xff01; kimi kimi编程过程 我们先看一下热捧的月之暗面的kimi模型。 …

谷歌(Google)技术面试概述

概述 谷歌&#xff08;Google&#xff09;技术面试非常困难而且富有挑战性。想要获得电话面试&#xff0c;你需要将简历提交到他们的在线申请系统或者通过内部员工进行推荐。 假设你通过了简历审阅&#xff0c;招聘人员会联系你。通常情况下会有两次电话面试&#xff0c;如果…

【PyQt5篇】和子线程进行通信

文章目录 &#x1f354;使用QtDesigner进行设计&#x1f6f8;和子线程进行通信&#x1f388;运行结果 &#x1f354;使用QtDesigner进行设计 我们首先使用QtDesigner设计界面 得到代码login.ui <?xml version"1.0" encoding"UTF-8"?> <ui …

Win10 桌面上应用程序的图标快捷键失效都变成白色图标 怎么修复?

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 桌面上应用程序的图标快捷键失效都变成白色图标 怎么修复 解决方案&#xff1a; 1.资源管理器&#xff0c;把“隐藏的项目”的打钩去掉,打开隐藏文件 2.在文件资源管理器的地址栏输入%localappdata%快速访问这…

C顺序表:通讯录

目录 前言 通讯录数据结构 通讯录初始化 查找名字 增加联系人 删除联系人 展示所有联系人 查找联系人 修改信息 销毁通讯录 完整通讯录代码 前言 数据结构中的顺序表如果已经学会了&#xff0c;那么我们就可以基于顺序表来完成一个通讯录了 通讯录其实我们使用前…

Coding and Paper Letter(八十八)

系列重启之CPL。 1 Coding: 1.一个Python库用来分析城市路网的工具箱&#xff0c;城市形态分析工具。 Madina 2.SkyPilot&#xff1a;在任何云上运行 LLM、AI 和 Batch。 通过简单的界面即可实现最大程度的节省性能、最高的 GPU 可用性和托管执行。 skypilot 3.探索美国卫…

creo扫描杯子学习笔记

creo扫描杯子学习笔记 扫描2要素&#xff1a; 轨迹&#xff0c; 截面。 多用于曲线扫描&#xff0c;区别于拉伸命令。 大小自定 旋转扫描 抽壳 草绘把手 扫描把手 复制曲面 实例化切除 成型

NOI - OpenJudge - 2.5基本算法之搜索 - 2753:走迷宫 - 超级无敌详细题解(含多个不同算法AC代码)

点赞关注吧~ 2753:走迷宫 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成&#xff0c;有的格子里有障碍物&#xff0c;不能走&#xff1b;有的格子是空地&#xff0c;可以走。 给定一个迷宫&#xff0c;求从左上角走到右下角最…

08 | Swoole 源码分析之 Timer 定时器模块

原文首发链接&#xff1a;Swoole 源码分析之 Timer 定时器模块 大家好&#xff0c;我是码农先森。 引言 Swoole 中的毫秒精度的定时器。底层基于 epoll_wait 和 setitimer 实现&#xff0c;数据结构使用最小堆&#xff0c;可支持添加大量定时器。 在同步 IO 进程中使用 seti…

无法直接启动带有”类库输出类型“的项目。若要调试此项目,请向引用库项目的此解决方案中添加可执行项目将此可执行项目设置为启动项目,

当你尝试直接启动一个类库&#xff08;Class Library&#xff09;项目时&#xff0c;你会遇到这样的错误消息&#xff0c;因为类库项目本身不生成可执行文件&#xff08;如 .exe 文件&#xff09;&#xff0c;它们只是包含可以被其他程序或应用程序引用的代码。 为了调试类库项…

今年过去了多少天?(switch)

//今年已经过去了几天&#xff1f; #include <stdio.h> int monthday(int year,int month){switch(month){case 1:return 31;case 2:if ((year % 4 0 && year % 100 ! 0)||year % 400 0){return 29;}else{return 28;}break;case 3:return 31;case 4:return 30;…

C语言进阶课程学习记录-第24课 - #pragma 使用分析

C语言进阶课程学习记录-第24课 - #pragma 使用分析 #pragma实验-#pragma messagecmd窗口运行 实验-pragma oncebcc编译报错gcc编译成功global.h代码优化 #pragma pack实验BCC编译器输出 小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程…

Php中依赖注入是怎样的

PHP依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于解决软件组件之间的耦合问题。在依赖注入中&#xff0c;一个对象的依赖项不是由对象本身创建或查找&#xff0c;而是由外部容器或调用者提供。这种方式使得对象更加模…

mysql乐观锁总结和实践:用version或者时间戳

谈到了MySQL悲观锁&#xff0c;但是悲观锁并不是适用于任何场景&#xff0c;它也有它存在的一些不足&#xff0c;因为 悲观锁大多数情况下依靠数据库的锁机制实现 &#xff0c;以保证操作最大程度的独占性。 如果加锁的时间过长&#xff0c;其他用户长时间无法访问&#xff0c;…

k8s1(1),Linux运维基础开发与实践

#设置主机名 hostnamectl hostnameXXX #配置免密(包括操作机) ssh-keygen ssh-copy-id master*/slave* #传输hosts cat > /etc/hosts <<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain loca…

【Qt 学习笔记】Qt 中出现乱码的解释及讨论

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 中出现乱码的解释及讨论 文章编号&#xff1a;Qt 学习笔记 / 06 文…