【优选算法】C++滑动窗口

news2025/6/9 2:18:54

1、长度最小的子数组

思路:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 滑动窗口
        // 1.left=0,right=0
        // 2.进窗口( += nums[right])
        // 3.判断
        //      出窗口
        // (4.更新结果)

        // 总和大于等于 target 的长度最小的 子数组
        int n = nums.size();
        int l_r_sum = 0;
        int ret_len = INT_MAX;
        for(int left = 0, right = 0; right < n; right++)
        {
            // 进窗口
            l_r_sum += nums[right];
            // 判断
            while(l_r_sum >= target)
            {
                // 更新结果
                int len = right - left + 1;
                if(len < ret_len)
                    ret_len = len;
                // 出窗口
                l_r_sum -= nums[left++];
            }
        }
        return ret_len==INT_MAX?0:ret_len;

    }
};

2、无重复字符的最长字串

 思路:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // 滑动窗口
        // 1.left=0,right=0
        // 2.进窗口( += nums[right])
        // 3.判断
        //      出窗口
        // (4.更新结果)

        int ret_len = 0, n = s.length();
        int hash[128] = {0};
        int len = 0;
        for(int left = 0, right = 0; right < n; right++)
        {
            // 进窗口
            hash[s[right]]++;
            // 判断是否含有重复字符
            while(hash[s[right]] > 1)
            {
                // 有重复字符
                // 出窗口
                hash[s[left]]--;
                left++;
                len--;
            }
            // 更新 字串的长度
            len++;
            if(ret_len < len)
                ret_len = len;
        }
        return ret_len;
    }
};

3.、最大连续 1 的个数 III

 

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        // 滑动窗口
        // 1.left=0,right=0
        // 2.进窗口( += nums[right])
        // 3.判断
        //      出窗口
        // (4.更新结果)(max:放外面;min:放里面)
        
        // 找出最长的子数组,0的个数不超过K个
        int n = nums.size(), ret_count = 0, zero_count = 0;
        for(int left = 0, right = 0; right < n; right++)
        {
            // 进窗口
            if(nums[right] == 0)
                zero_count++;
            // 判断是否超过 k 个
            while(left < n && zero_count > k)
            {
                // 出窗口
                if(nums[left++] == 0)
                    zero_count--;
            }
            ret_count = max(ret_count, right-left+1);
        }
        return ret_count;
    }
};

4、将 x 减到 0 的最小操作数

 思路:

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        // 滑动窗口
        // 1.left=0,right=0
        // 2.进窗口( += nums[right])
        // 3.判断
        //      出窗口
        // (4.更新结果)(max:放外面;min:放里面)

        // 找出最长的子数组,使它们的和等于 sum - x
        int all_sum = 0;
        for(auto & e : nums)
            all_sum+=e;
        int target = all_sum-x;

        // 1  1  4  2  3
        int max_len = -1, n = nums.size();
        int max_sum = 0;
        for(int left = 0, right = 0; right < n; right++)
        {
            // 进窗口
            max_sum += nums[right];
            // 判断
            while(left < n && max_sum > target) // 先比它大
            {
                // 出窗口
                max_sum -= nums[left++];
            }   
            if(max_sum == target)   // 后判断相等
                max_len = max(right-left+1, max_len);
        }
        return max_len==-1?-1:n-max_len;
    }
};

5、水果成篮

 思路:

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        unordered_map<int, int> hash;       
        int n = fruits.size();
        int ret = 0;

        for(int left =0,right = 0; right < n; right++)
        {
            hash[fruits[right]]++;
            while(hash.size() > 2)     //判断
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]] == 0)
                    hash.erase(fruits[left]);
                left++;
            }
            ret = max(ret, right-left+1);
        }
        return ret;
    }
};

6、找到字符串中是所有字母异位词(*)

思路:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        // 滑动窗口
        // 1.left=0,right=0
        // 2.进窗口( += nums[right])
        // 3.判断
        //      出窗口
        // (4.更新结果)(max:放外面;min:放里面)

        vector<int> ret_vector;
        int hash_s[26] = {0};
        int hash_p[26] = {0};
        for(auto& xp : p)
            hash_p[xp-'a']++;
        int n = s.size();
        for(int left = 0, right = 0; right < n; right++)
        {
            // 进窗口
            hash_s[s[right]-'a']++;
            // 判断两个 hash 是否相同
            while(right - left + 1 > p.size())
            {
                // 出窗口
                hash_s[s[left]-'a']--;
                left++;
            }
            if(HashSame(hash_s, hash_p))
                // 两个hash 相同
                ret_vector.push_back(left);
        }
        return ret_vector;
    }
    bool HashSame(int* hash_s, int* hash_p)
    {
        for(int i = 0; i < 26; i++)
        {
            if(hash_s[i] != hash_p[i])
                return false;
        }
        return true;
    }
};

7、串联所有单词的字串

思路:

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ret;

        unordered_map<std::string, int> hash1;
        for (auto& str : words) {
            hash1[str]++;
        }

        int len = words[0].size(), m = words.size();
        for (int i = 0; i < len; i++) // 执行 len 次
        {
            unordered_map<std::string, int> hash2;
            for (int left = i, right = i, count = 0; right + len <= s.size(); right+=len) {
                // 进窗口
                string in = s.substr(right, len);
                hash2[in]++;
                if(hash1.count(in) && hash2[in] <= hash1[in]) count++;
                // 判断
                if(right - left + 1 > len * m)
                {
                    // 出窗口 + 维护 count
                    string out = s.substr(left, len);
                    if(hash1.count(out) && hash2[out] <= hash1[out]) count--;
                    hash2[out]--;
                    left += len;
                }
                // 更新结构
                if(count == m) ret.push_back(left); 
            }
        }
        return ret;
    }
};

 8、最小覆盖字串

 思路:

class Solution {
public:
    string minWindow(string s, string t) {
        int hash1[128] = {0};
        int kinds = 0;  // 统计有效字符有多少种
        for(auto& e : t)
        {
            if(hash1[e] == 0) kinds++;
            hash1[e]++;
        }

        int hash2[128] = {0};       // 维护s
        int minlen = INT_MAX, begin = -1;
        for(int left = 0, right = 0, count = 0; right < s.size(); right++)
        {
            char in = s[right];
            hash2[in]++;
            if(hash2[in] == hash1[in]) count++;
            while(kinds == count)
            {
                if(right - left + 1 < minlen)
                {
                    minlen = right - left +1;
                    begin = left;
                }
                char out = s[left++];
                if(hash2[out] == hash1[out]) count--;
                hash2[out]--;
            }
        }
        if(minlen == INT_MAX) return "";
        else return s.substr(begin, minlen);
    }
};

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

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

相关文章

关于GitHub action云编译openwrt

特别声明:此教程仅你有成功离线编译的经验后,使用下列教程更佳 不建议没有任何成功经验的人进行云编译 1、准备工作 使用GitHub云编译模板 GitHub - jxjxcw/build_openwrt: 利用Actions在线云编译openwrt固件,适合官方源码,lede,lienol和immortalwrt源码,支持X86,电…

sql入门语句-案例

Sql入门 数据库、数据表、数据的关系介绍 数据库 用于存储和管理数据的仓库 一个库中可以包含多个数据表 数据表 数据库最重要的组成部分之一 它由纵向的列和横向的行组成(类似excel表格) 可以指定列名、数据类型、约束等 一个表中可以存储多条数据 数据 想要永久化存储…

A Survey on the Memory Mechanism of Large Language Model based Agents

目录 摘要Abstract1. LLM-Based Agent的Memory1.1 基础概念1.2 用于解释Memory的例子1.3 智能体记忆的定义1.3.1 狭义定义(肯定不用这个定义)1.3.2 广义定义 1.4 记忆协助下智能体与环境的交互过程1.4.1 记忆写入1.4.2 记忆管理1.4.3 记忆读取1.4.4 总过程 2. 如何实现智能体记…

华为OD机试 - 猴子吃桃 - 二分查找(Java 2025 B卷 200分)

public class Test14 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String[] s = sc.nextLine().split(" ");int[] arr = new int[s.length-1];int count = Integer.parseInt(s[s

【设计模式-5】设计模式的总结

说明&#xff1a;介绍完所有的设计模式&#xff0c;本文做一下总结 设计模式介绍 博主写的设计模式博客如下&#xff1a; 【设计模式-1】UML和设计原则 【设计模式-2.1】创建型——单例模式 【设计模式-2.2】创建型——简单工厂和工厂模式 【设计模式-2.3】创建型——原型…

【无人机】无人机UAV、穿越机FPV的概念介绍,机型与工具,证书与规定

【无人机】无人机UAV、穿越机FPV的概念介绍&#xff0c;机型与工具&#xff0c;证书与规定 文章目录 1、无人机的定义、概念、技术栈1.1 无人机的概念1.2 无人机技术&#xff08;飞控&#xff0c;动力&#xff0c;通信&#xff09; 2、无人机机型2.1 DJI无人机 &#xff08;航拍…

链表好题-多种实现

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 这道题非常经典&#xff0c;很多大厂都作为面试题。 方法一&#xff1a;寻找中点翻转链表合并链表 class Solution { public:void reorderList(ListNode* head) {if (head nullptr) {return;}ListNode* mid middleNo…

oracle数据恢复—oracle数据库执行truncate命令后的怎么恢复数据?

oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下&#xff0c;oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况&#xff0c;例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致…

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在网络上搜索onenet&#xff0c;注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT&#xff0c;其他的内容自己填写 6.这里产品以及开发完成&#xff0c;接下来就是添加设…

分享两个日常办公软件:uTools、PixPin

1. uTools 网址&#xff1a;https://u.tools/ 这是一个高效智能的在线工具平台。 特点&#xff1a; 专为提升用户的工作效率跟生活便利性设计。 优点&#xff1a; 1&#xff1a;由国内团队开发。 2&#xff1a;通过插件化的方式为用户提供多样化的功能支持。 3&#xf…

Golang基础学习

​​​​​​​​​​ 初见golang语法 go项目路径 cd $GOPATH //ls可以看到有bin,pkg,src三个文件 cd src/ mkdir GolangStudy cd GolangStudy mkdir firstGolanggo程序执行: go run hello.go//如果想分两步执行: go build hello.go ./hello导入包的方式 import "f…

Spark 之 DataFrame 开发

foreachPartition val data = spark.sparkContext.parallelize(1 to 100)// 使用 foreachPartition 批量处理分区 data.foreachPartition {partitionIterator =

嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析

第一部分 移除挂起等待列表中的任务 while( listLIST_IS_EMPTY( &xPendingReadyList ) pdFALSE )//循环寻找直到为空&#xff0c;把全部任务扫描一遍 { pxTCB ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingR…

机器学习KNN算法全解析:从原理到实战

大家好&#xff01;今天我们来聊聊机器学习中的"懒人算法"——KNN&#xff08;K-Nearest Neighbors&#xff0c;K近邻&#xff09;算法。这个算法就像个"墙头草"&#xff0c;它不学习模型参数&#xff0c;而是直接根据邻居的"投票"来做决策&…

【QT】自定义QWidget标题栏,可拖拽(拖拽时窗体变为normal大小),可最小/大化、关闭(图文详情)

目录 0.背景 1.详细实现 思路简介 .h文件 .cpp文件 0.背景 Qt Linux&#xff1b;项目遇到问题&#xff0c;解决后特此记录 项目需要&#xff0c;个性化的标题栏&#xff08;是个widget&#xff09;&#xff0c;在传统的三个按钮&#xff08;最大化、最小化、关闭&#xf…

FPGA定点和浮点数学运算-实例对比

在创建 RTL 示例时&#xff0c;经常使用 VHDL 2008 附带的 VHDL 包。它提供了出色的功能&#xff0c;可以高效地处理定点数&#xff0c;当然&#xff0c;它们也是可综合的。该包的一些优点包括&#xff1a; 有符号和无符号&#xff08;后缀和后缀&#xff09;定点向量。轻松将定…

Linux编程:2、进程基础知识

一、进程基本概念 1、进程与程序的区别 程序&#xff1a;静态的可执行文件&#xff08;如电脑中的vs2022安装程序&#xff09;。进程&#xff1a;程序的动态执行过程&#xff08;如启动后的vs2022实例&#xff09;&#xff0c;是操作系统分配资源的单位&#xff08;如 CPU 时…

Cursor Rules 使用

前言 最近在使用 Cursor 进行编程辅助时&#xff0c;发现 AI 生成的代码风格和当前的代码风格大相径庭。而且有时它会输出很奇怪的代码&#xff0c;总是不符合预期。 遂引出本篇&#xff0c;介绍一下 Rules &#xff0c;它就可以做一些规范约束之类的事情。 什么是 Cursor R…

服务器数据恢复—服务器raid5阵列崩溃如何恢复数据?

服务器数据恢复环境&故障&#xff1a; 某品牌型号为X3850服务器上有一组由14块数据盘和1块热备盘组建的raid5磁盘阵列。 服务器在正常使用过程中突然崩溃&#xff0c;管理员查看raid5阵列故障情况的时发现磁盘阵列中有2块硬盘掉线&#xff0c;但是热备盘没有启用。 服务器数…

Go语言堆内存管理

Go堆内存管理 1. Go内存模型层级结构 Golang内存管理模型与TCMalloc的设计极其相似。基本轮廓和概念也几乎相同&#xff0c;只是一些规则和流程存在差异。 2. Go内存管理的基本概念 Go内存管理的许多概念在TCMalloc中已经有了&#xff0c;含义是相同的&#xff0c;只是名字有…