算法基础学习Day6(动态窗口)

news2025/2/27 23:12:50

在这里插入图片描述

文章目录

  • 1.题目
  • 2.题目解答
    • 1.最大连续1的个数
      • 题目及题目解析
      • 算法学习
        • 思路一:暴力解法
        • 思路二:滑动窗口
      • 代码提交
    • 2.将x减到0的最小操作数
      • 题目及题目解析
      • 算法学习
        • 滑动窗口解决问题
      • 代码提交

1.题目

  1. 1004. 最大连续1的个数 III - 力扣(LeetCode)
  2. 1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

2.题目解答

1.最大连续1的个数

题目及题目解析

image-20241210182148011

算法学习

思路一:暴力解法

我们可以通过直接遍历将数组,将所以可能全部找出来,然后将最长的数组返回即可

解法如下:

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int maxLen = 0;
        for (int start = 0; start < nums.size(); ++start) {
            int zeroCount = 0;
            int end = start;
            while (end < nums.size()) {
                if (nums[end] == 0) {
                    zeroCount++;
                }
                if (zeroCount <= k) {
                    maxLen = max(maxLen, end - start + 1);
                } else {
                    break;
                }
                end++;
            }
        }
        return maxLen;
    }
};

当然这是过不了的需要我们优化

image-20241210185312807

思路二:滑动窗口

但是其实发现right指针并不用每次都回到left的右边

我们可以通过计数让left向后走,而right可以保持在原有位置

也就是说可以用滑动窗口解决这个问题:

1.进窗口

image-20241210191931544

k加上right能移动到的最大位置就是窗口的初始化

2.出窗口

零的个数大于k时,就要将left向右移动,然后对left进行判断,

零的个数减到等于k此时就完成了出窗口

每次出窗口对长度进行判断求最大的长度即可

这部分的代码如下:

int ret = 0;
for(int right = 0,left = 0,zero = 0;right<nums.size();right++)
        {
            if(nums[right]==0)//进窗口
            {
                zero++;
            }
    
            while(zero>k)//出窗口
            {
                if(nums[left++]==0)
                {
                    zero--;
                }
            }
            ret = max(ret,right-left+1);//判断
        }

代码提交

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int left = 0,right =0,zero = 0;
        int ret = 0;
        for(;right<nums.size();right++)
        {
            if(nums[right]==0)
            {
                zero++;
            }
            while(zero>k)
            {
                if(nums[left++]==0)
                {
                    zero--;
                }
            }
            ret = max(ret,right-left+1);
        }
        return ret;
    }
};

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

题目及题目解析

image-20241210193455492

算法学习

这道题如果直接做会很难,但是如果将思路转化一下,就会变得简单了:

image-20241210194229560

要求的数的和为x,我们可以将这个数组的和计算出为sum,那么剩下的数组就为sum-x

又由于要求出最小长度就可以转化为求最长子数组的长度了

那么这道题就变得简单了求最长子数组的长度且数组的和为target

滑动窗口解决问题

转换后的这道题之前写过:

int right = 0,left = 0,sum = 0,ret = 0;
while(right<nums.size())
{
    sum+=nums[right];
    while(sum>target)
    {
        sum -= nums[left];
        left++;
    }
    if(sum == target)
    {
        ret = max(ret,right-left+1);
    }
    right++;
}

核心代码写完后后续将判断返回的内容加入即可

代码提交

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum = 0,target = 0,left = 0,right = 0;
        for(int i = 0;i<nums.size();i++)
        {
            sum+=nums[i];
        }
        target = sum-x;
        if(target<0)
        {
            return -1;
        }
        sum = 0;
        int ret = -1;
        while(right<nums.size())
        {
            sum+=nums[right];
            while(sum>target)
            {
                sum -= nums[left];
                left++;
            }
            if(sum == target)
            {
                ret = max(ret,right-left+1);
            }
            right++;
        }
        if(ret==-1)
        {
            return ret;
        }
        else
        {
            return nums.size()-ret;
        }
    }
};

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

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

相关文章

开发一套SDK 第一弹

自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…

【leetcode】替换后的最长重复字符、将字符串翻转到单调递增

1.替换后的最长重复字符 示例如下&#xff1a; 下面我们来分析一下一个例子&#xff0c;其中K 2 暴力枚举 这里的字符串s是仅由大写字母组成&#xff0c;首先我们尝试用暴力解法的思路来想一下这道题&#xff0c;通过从第一个字符开始进行枚举&#xff0c;如果出现了条件判断…

HarmonyOS 线性容器List 常用的几个方法

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和LinkedList相比&#xff0c;LinkedList是双向链表&#xff0c;可以快速…

C# 网络编程--基础核心内容

在现今软件开发中&#xff0c;网络编程是非常重要的一部分&#xff0c;本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌&#xff1a; : 上图引用大佬的图&#xff0c;大家也关注一下&#xff0c;有技术有品质&#xff0c;有国有家&#xff0c;情…

基于Python实现web网页内容爬取

文章目录 1. 网页分析2. 获取网页信息2.1 使用默认的urllib.request库2.2 使用requests库1.3 urllib.request 和 requests库区别 2. 更改用户代理3. BeautifulSoup库筛选数据3.1 soup.find()和soup.find_all() 函数 4. 抓取分页链接参考资料 在日常学习和工作中&#xff0c;我们…

ASP .NET Core 中的环境变量

在本文中&#xff0c;我们将通过组织一场小型音乐会&#xff08;当然是在代码中&#xff09;来了解 ASP .NET Core 中的环境变量。让我们从创建项目开始&#xff1a; dotnet new web --name Concert 并更新Program.cs&#xff1a; // replace this: app.MapGet("/"…

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…

操作系统:中断与处理器调度

目录 1、中断与中断系统 中断概念&#xff1a; 中断装置&#xff1a; 中断相关概念&#xff1a; 中断优先级别与中断屏蔽 2、处理机&#xff08;CPU&#xff09;调度 调度相关参数&#xff1a;P62 调度算法&#xff1a; 处理机调度时机 处理机调度过程 3、调度级别与多…

【推荐算法】单目标精排模型——FiBiNET

key word: 学术论文 Motivation&#xff1a; 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的&#xff0c;这篇文章的作者提出了采用SENET实现动态学习特征的重要性&#xff1b;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…

AndroidStudio配置aar包的依赖方式

创建本地仓库文件夹和aar文件夹 创建本地仓库文件夹LocalRepo&#xff0c;文件夹名称可以自定义。在LocalRepo文件夹下为每一个aar单独创建文件夹&#xff0c;如下所示。aar包就放在各自的文件夹下。请注意一个aar文件夹下只能放置一个aar。 配置build.gradle文件 在aar文件…

unity 让文字变形

效果&#xff1a; using TMPro; using UnityEngine; using NaughtyAttributes;[ExecuteInEditMode] public class TMTextPerpective : MonoBehaviour {[OnValueChanged("DoPerspective")][Range(-1f, 1f)]public float CenterBias 0f;[OnValueChanged("DoPers…

关于SpringBoot项目创建后构建总是失败的问题

第一个问题&#xff1a;IDEA创建项目总是失败 原因&#xff1a;创建项目的时候默认使用的是https://start.spring.io&#xff0c;这个是一个外国网站&#xff0c;众所周知的就是国内访问总是出现不稳定的现象&#xff0c;这就是导致项目创建失败的最终原因。 解决方法&#x…

个人IP建设:简易指南

许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者&#xff0c;您无法使用营销团队&#xff0c;因此许多人通过推荐和他们的网络来产生需求。因此&#xff0c;扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…

LLM对话过程的DDD

终于抽出时间调整了一下DDD的结构&#xff0c;感觉这套设计虽然有些不是很原教旨&#xff0c;但已经能很好的支持至少一年的业务迭代了。直接给结论&#xff0c;直接抄也不会有什么错。 整体方案脱胎自openai的assistant api Entity Thread&#xff0c;对话过程。由Message构…

IO进程 学习笔记

……接上文 fputs&#xff08;输入字符串&#xff09; int fputs(const char *s, FILE *stream);功能&#xff1a;向指定文件中输入一串字符参数&#xff1a;s:输入字符串的首地址stream&#xff1a;文件流指针返回值&#xff1a;成功返回输出字符个数失败返回EOF文件指针偏移函…

【Linux】系统安装内核后重启发现进不去系统

问题现象1 系统安装内核后重启发现进不去系统 问题排查步骤 进入pe模式或者livecd模式 使用mount挂载原系统/分区 chroot 刚挂载的/分区目录进入原系统 查询到发现内核存在安装失败 挂载/分区 在pe模式执行mount /分区 /mnt 使用 chroot 切换到你的环境&#xff1a; sudo …

重视猫艾滋:宠物健康的隐秘挑战

猫艾滋&#xff0c;全称为猫获得性免疫缺陷综合征&#xff08;Feline Acquired Immunodeficiency Syndrome&#xff09;&#xff0c;是由猫免疫缺陷病毒&#xff08;FIV&#xff09;感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似&#xff0c;但猫艾滋仅在…

python学习笔记—5—标识符和运算符

1. 标识符 &#xff08;1&#xff09;定义 用户在编程时所使用的一系列名字&#xff0c;用于给变量、类、方法等命名 &#xff08;2&#xff09;标识符命名规则 <1>内容限定 标识符的命名中只能由数字、英文、中文、下划线组成&#xff0c;其他都不被允许使用…

东方资产管理校招笔试测评题型题目深入解读

东方资管作为四大资产AMC公司之一&#xff0c;其薪资待遇还是不错的&#xff0c;现在为数不多还可以投递简历的金融央企。东方资产管理校招笔试一般在简历投递截止后的周末&#xff0c;总部和子公司、分公司需要分别做笔试。 东方资管笔试大概2h&#xff0c;线上双机位&#x…

Linux---对缓冲区的简单理解--第一个系统程序

前序&#xff1a; 首先先理解一下什么是回车与换行&#xff1b;回车和换行是两个概念&#xff0c;它们不是一个东西&#xff1b; 回车:光标回到开始&#xff1b;换行:换到下一行&#xff1b; 如下图&#xff1a; 行缓冲区 如何理解缓冲区问题&#xff1f; 可以认为&#xff0…