算法2:滑动窗口(上)

news2024/11/24 11:47:58

文章目录

  • 长度最小子数组
  • 无重复字符的最长子串
  • [最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)
  • 将x减到0的最小操作数

长度最小子数组

在这里插入图片描述

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len = INT_MAX;
        int right = 0, left = 0;
        int sum = 0;
        while(left <= right && right < nums.size())
        {
            sum += nums[right++];//进窗口
            while(sum >= target) //判断
            {
                len = min(len, right - left);
                sum -= nums[left++]; // 出窗口
            }
        }
        return len == INT_MAX ? 0 : len;
    }
};

无重复字符的最长子串

在这里插入图片描述

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        int left = 0, right = 0;
        int hash[127] = {0};
        int res = 0;

        while (right < n) {
            hash[s[right]]++; // 进窗口,右端滑动
            if (hash[s[right]] > 1) {
                while (hash[s[left]] != hash[s[right]])
                    hash[s[left++]]--;
                hash[s[left++]]--;
            } else {
                res = max(res, right - left + 1);
            }
            right++;
        }
        return res;
    }
};

int max(int a, int b)
{
    return a > b ? a : b;
}
int lengthOfLongestSubstring(char * s){
    int n = strlen(s);
    int left = 0, right = 0, res = 0;
    int hash[127] = {0};
    while(right < n)
    {
        hash[s[right]]++;
        while(hash[s[right]] > 1)
            hash[s[left++]]--;
        res = max(res,right - left + 1);
        right++;
    }
    return res;
} 

解析:
在这里插入图片描述


最大连续 1 的个数III

在这里插入图片描述

在这里插入图片描述

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int res = 0,zero = 0;
        for(int left = 0,right = 0; right < nums.size();right++)
        {
            if(nums[right] == 0)    zero++;//进窗口
            while(zero > k)
            {
                if(nums[left++] == 0) zero--;
            }    
            res = max(res,right - left + 1);
        }
        return res;
    }
};
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0, right = 0;
        int zero = 0, res = 0;
        while (right < nums.size()) {
            // 进窗口
            while (right < nums.size() && nums[right])
                right++;
            // 判断
            if (right < nums.size() && ++zero <= k) {
                right++;
                // 数据更新
                res = max(res, right - left);
            } else {
                // 数据更新
                res = max(res, right - left);
                // 出窗口
                while (left < right && nums[left])
                    left++;
                k--;
                left++;
                right++;
            }
        }
        return res;
    }
};

将x减到0的最小操作数

在这里插入图片描述

正难则反

该题从正面去解,一会儿左一会儿右全凭场景所变化,编码写起来非常繁琐;此时,运用数学思维反证法来解决会不会简单些呢?该题需要求最小操作数,那也就意味着剩下的数据量是最大的,而且因为每次操作都在最左或者最右边,那也就是说剩下的数据是原数据的连续子串;OK,现在我们只需要求出一个符合的尽可能保证数据量大其sum值等于sum(nums) - x连续子串即可.

那现在将符合要求数据看成一个窗口往后滑动即可。

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        for(int e : nums)   sum += e;
        if(x > sum) return -1;
        if(x == sum) return nums.size();
        int target = sum - x;
        int res = -1;
        for(int left = 0, right = 0, tmp = 0; right < nums.size(); right++)
        {
            tmp += nums[right];//进窗口
            while(tmp >= target)
            {
                if(tmp == target)   res = max(res, right - left +1);//判断+记录长度
                tmp -= nums[left++];// 出窗口
            }
        }

        if(res == -1)
            return res;
        return nums.size() - res;
    }
};
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0;
        for (int e : nums)
            sum += e;
        if (x > sum)
            return -1;//细节
        int target = sum - x;
        int res = -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)
                res = max(res, right - left + 1); // 更新数据
        }

        if (res == -1)
            return res;
        return nums.size() - res;
    }
};

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

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

相关文章

线段(线性dp)

题目链接&#xff1a;[TJOI2007] 线段 - 洛谷 思路&#xff1a; f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理&#xff0c;停在右端点的最少步数。 那么转移就很简单了&#xff0c;走完当前行且停到左端点&#xff0c;那么一定是从右端点过来的&#x…

torch配置时出现问题

torch配置时出现如下问题&#xff1a; 可能原因&#xff1a; 1、下载的whl文件中python版本与本机上的python版本不匹配&#xff1b; 2、上图中的文件是64位的&#xff0c;而本机python是32位的&#xff0c;也无法匹配&#xff1b; 3、cuda的版本不匹配。

基于springboot实现的校园博客系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Word怎么画图?这5个方法收藏好!

“我需要在Word文档中画一些图&#xff0c;想问下Word应该怎么画图呢&#xff1f;有没有朋友可以帮我看看怎么操作呢&#xff1f;” 在今天的数字化时代&#xff0c;信息爆炸式增长&#xff0c;人们越来越需要高效、直观地传递和接收信息。而Word画图功能正是这一需求的完美体现…

黑马点评0——总览篇

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

自己手写一个线性表List【C风格】

#include <iostream>//线性表、顺序表List#define MAX_SIZE 20 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int Status;//返回状态类型 typedef int ElemType;//元素类型//结构体 typedef struct {ElemType data[MAX_SIZE];//数据类型&#x…

泰坦尼克生还预测

文章目录 第1关&#xff1a;存活率与性别和船舱等级之间的关系第2关&#xff1a;各个口岸的生还率第3关&#xff1a;统计各登船口岸的登船人数以及生还率第4关&#xff1a;船客兄弟姐妹妻子丈夫的数量与生存率之间的关 第1关&#xff1a;存活率与性别和船舱等级之间的关系 编程…

04-Json/Ajax/Vue的知识

1. Json结构 1.1 Json概述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;实现数据前后端交互。 它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换…

Django性能优化:提升加载速度

title: Django性能优化&#xff1a;提升加载速度 date: 2024/5/20 20:16:28 updated: 2024/5/20 20:16:28 categories: 后端开发 tags: 缓存策略HTTP请求DNS查询CDN分发前端优化服务器响应浏览器缓存 第一章&#xff1a;Django性能优化概述 1.1 性能优化的意义 性能优化是…

探索移动云:我的ES与Kibana之旅

目录 引言&#xff1a; 如何免费体验移动云产品 登录并完成实名认证 选择试用ECS云主机 安全组配置 安装Elasticsearch和Kibana 安装Elasticsearch ​编辑安装kibana 测试结果 使用感觉 引言&#xff1a; 移动云技术产品的发展已经取得了巨大的进步。云数融合、A1、大…

【区域脑图论文笔记】BrainNetCNN:第一个专门为脑网络连接体数据设计的深度学习框架

【区域脑图论文笔记】BrainNetCNN&#xff1a;第一个专门为脑网络连接体数据设计的深度学习框架 信息概览与提炼采用的数据与结果数据集结果概览一眼 重点图与方法概览核心与优劣总结模型与实验论文方法E2E的理解E2N的理解N2G的理解三个卷积层设计的理解 论文实验与讨论 总结与…

必应搜索打开后出现Ref A,Ref B,Ref C是怎么回事

微软的垃圾产品&#xff0c;服务器还宕机了&#xff0c;当然访问不了

Apache Flink CDC 3.1.0版本知识学习

Apache Flink CDC 3.1.0版本知识学习 一、Flink CDC 3.1 快速预览二、Transformation 支持三、分库分表合并支持四、使用 Kafka Pipeline Sink 高效写入 Canal/Debezium 格式数据五、更高效地实时入湖 Paimon六、其他改进七、Flink CDC 3.1 版本兼容性 一、Flink CDC 3.1 快速预…

首都师范大学聘请旅美经济学家向凌云为客座教授

2024年4月17日&#xff0c;首都师范大学客座教授聘任仪式在首都师范大学资源环境与旅游学院举行。首都师范大学资源环境与旅游学院院长吕拉昌主持了仪式&#xff0c;并为旅美经济学家向凌云教授颁发了聘书。 吕拉昌院长指出&#xff0c;要贯彻教育部产学研一体化战略&#xff0…

2024年电工杯数学建模A题思路分享 - 园区微电网风光储协调优化配置

# 1 赛题 A 题&#xff1a; 园区微电网风光储协调优化配置 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的 负荷占比&#xff0c;需配置较高比例的风光发电装机容量&#xff0c;但由于园区负荷与风光发电功 率时序不匹配&#xff0c; 可能导致…

C语言-牛客-实现四舍五入

欢迎来到Harper.Lee的学习小世界&#xff01; 博主主页传送门&#xff1a;Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦&#xff01; 本篇博客总结C语言刷题的相关笔记~~~~ #牛客–实现四舍五入 题目描述&#xff1a;随机输入浮点数&#xff0c;输出四舍五入后的整数…

Windows安全应急--反隐身术

NO.1 dir命令 首先做个演示&#xff0c;把演示01这个文件夹隐藏起来&#xff0c; 在文件夹上是看不到了&#xff0c; 我们可以使用dir命令查看&#xff0c; NO.2 文件夹选项–显示隐藏 这个是非常常规的了&#xff0c; 这里不做过多介绍 有些隐藏文件很顽固&#xff0c;上面…

关于智慧校园安全用电监测系统的设计

人生人身安全是大家关注的话题&#xff0c;2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起&#xff08;中国消防2019.12.应急管理部消防救援局官方微博&#xff09;&#xff0c;违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数&#…

离散数学--图论

目录 1.简单概念 2.握手定理 3.点割集 4.边割集 5.点连通度和边连通度 6.Dijstra算法&&最短路径 7.有向图的连通性 8.图的矩阵表示 9.欧拉图问题 10.哈密尔顿图 1.简单概念 &#xff08;1&#xff09;这个里面的完全图比较重要&#xff0c;完全图是例如k3,k5这…

xcode配置快速打开终端命令行工具教程

以往我们使用idea编辑器或者vscode编辑器的时候&#xff0c;我们可以快速的在编辑器下面打开终端进行相关的操作&#xff0c;但是在xcode里面却没有这么方便的功能按钮&#xff0c;真的不是很习惯&#xff0c;所以这次就来给xcode配置这么一个方便的功能。 idea的Terminal 这…