【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中就不会存在几个数的和==x
        if (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;
        else
            return nums.size() - ret;
    }
};

2.水果成篮

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

分析

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

代码

class Solution
{
public:
    int totalFruit(vector<int> &f)
    {
        // i是树的下标 fruits[i]是水果的种类编号 fruits[i]: 0~100000
        int 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;
    }
};

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

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

相关文章

EXCEL地理数据处理工具(地图任务)

版本号 作者 修订内容 发布日期 1.0 小O 更新至0705版 2022-4-28 1.1 小O 更新至0772版 2024年4月3日 一、概述 小O地图EXCEL插件版提供基于EXCEL表格进行地理数据处理、地图可视化、地图绘图等功能&#xff0c;地理工具是用户使用频率很高的功能模块。地理工具能…

hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序

一、原始消费数据buy.txt zhangsan 5676 2765 887 lisi 6754 3234 1232 wangwu 3214 6654 388 lisi 1123 4534 2121 zhangsan 982 3421 5566 zhangsan 1219 36 45二、实现思路&#xff1a;先通过一个MapReduce将顾客的消费金额进行汇总&#xff0c;再通过一个MapReduce来根据金…

easyExcel 模版导出 中间数据纵向延伸,并且对指定列进行合并

想要达到的效果 引入maven引用 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version></dependency> 按照要求创建模版 备注 : 模板注意 用{} 来表示你要用的变量 如果本…

【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化

目录 1、bean是什么 2、配置bean 2.1、使用Bean注解配置Bean 2.2、使用Import注解配置Bean 3、实例化Bean 1、bean是什么 在 Spring 中&#xff0c;Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置和管理这些 Bean 对象的生命周期。Spring IOC 容器会管…

网络基础二——传输层协议UDP与TCP

九、传输层协议 ​ 传输层协议有UDP协议、TCP协议等&#xff1b; ​ 两个远端机器通过使用"源IP"&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”&#xff0c;"协议号"来标识一次通信&#xff1b; 9.1端口号的划分 ​ 0-10…

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器&#xff0c;可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开&#xff1a; gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件&#xff0c;但是用终端打开gedit可以动用更高的权限&#xff…

OpenHarmony实战开发-使用一次开发多端部署实现一多设置典型页面

介绍 本示例展示了设置应用的典型页面&#xff0c;其在小窗口和大窗口有不同的显示效果&#xff0c;体现一次开发、多端部署的能力。 1.本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备&#xff08;或多窗口尺寸&#xff09;适配&#xff0c;保…

掌握机器学习新星:使用Python和Scikit-Learn进行图像识别

正文&#xff1a; 随着智能手机和社交媒体的普及&#xff0c;图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据&#xff0c;我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库&#xff0c;它…

谷粒商城实战(010 缓存-解决数据一致性问题以及SpringCache的使用)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第166p-第p172的内容 缓存一致性问题解决 redisson使用lua脚本&#xff0c;所以的锁都保证了原子性 改之前的代码 锁的粒度越小越好 如11号…

PS入门|黑白色的图标怎么抠成透明背景

前言 抠图可以算是PS的入门必备操作&#xff0c;开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦&#xff01;但切勿心急&#xff5e; 今天给小伙伴们带来&#xff1a;黑白色的图标抠图教程 抠图有很多种方法&#xff0c;但根据类型的不同&#xff0c;使用适当的方法很重…

Redis底层数据结构-Dict

1. Dict基本结构 Redis的键与值的映射关系是通过Dict来实现的。 Dict是由三部分组成&#xff0c;分别是哈希表&#xff08;DictHashTable&#xff09;&#xff0c;哈希节点&#xff08;DictEntry&#xff09;&#xff0c;字典&#xff08;Dict&#xff09; 哈希表结构如下图所…

YUNBEE云贝-2024年4月PostgreSQL PGCM认证实战培训

课程介绍 了解关注开源技术&#xff0c;学习PG以点带面 Linux/Andriod&#xff08;操作系统&#xff09;、Apache/Tomcat&#xff08;应用服务器&#xff09;、OpenStack/KVM&#xff08;虚拟化&#xff09;、Docker/K8S&#xff08;容器化&#xff09;、Hadoop&#xff08;大…

利用Python和Selenium实现定时任务爬虫

网络爬虫在信息获取、数据分析等领域发挥着重要作用&#xff0c;而定时爬虫则可以实现定期获取网站数据的功能&#xff0c;为用户提供持续更新的信息。在Python中&#xff0c;结合Selenium技术可以实现定时爬虫的功能&#xff0c;但如何设置和优化定时爬虫的执行时间是一个关键…

C语言编写Linux的Shell外壳

目录 一、输出命令行 1.1 了解环境变量 1.2 获取用户名、主机名、当前路径 1.3 缓冲区改进MakeCommandLine 二、获取用户命令 2.1 读取函数的选择 2.2 细节优化 2.3 返回值 三、指令和选项分割 3.1 strtok 函数 3.2 分割实现 四、执行命令 4.1 fork 方法 4.2 进…

Qt C++ | Qt 元对象系统、信号和槽及事件(第一集)

01 元对象系统 一、元对象系统基本概念 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使用元…

蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录 前言 1. RTC介绍 2. 使用CubeMx进行源工程配置 3. 代码编程 3.1 准备工作 3.2 进行bsp_rtc.h编写 3.3 进行bsp_rtc.c编写 3.4 main.c编写 3.4.1 头文件引用 3.4.2 变量声明 3.4.3 子函数声明 3.4.4 函数实现 3.4.5 main函数编写 4. 代码实验 5. 总结 前言 因本人备赛蓝…

2024年购买阿里云服务器多少钱?100元-5000元预算

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

IntelliJ IDEA中文---强化智能编码与重构,提升开发效率

IntelliJ IDEA 2023是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它支持智能代码编辑、自动补全和重构&#xff0c;帮助开发者提高编码效率。同时&#xff0c;内置了丰富的调试工具&#xff0c;支持断点调试和变量监视&#xff…

STM32-04基于HAL库(CubeMX+MDK+Proteus)中断案例(按键中断扫描)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的按键检测代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在完成GPIO输入输出案例之后&#xff0c;开始新的功能…