滑动窗口_⻓度最⼩的⼦数组⽆重复字符的最⻓⼦串将x减到0的最⼩操作数

⻓度最⼩的⼦数组(medium

https://leetcode.cn/problems/minimum-size-subarray-sum/

思路一:两个指针,p1 p2同时指向第一个元素。sum+=p2,如果sum<target,p2++直到大于,然后记录len=right-left。p1 p2再同时指向第二个元素,再不断循环。直到p2越界。

思路2:滑动窗口

其实在思路一基础上,p2没必要再退回到p1的位置,p1++后 在原sum基础上减去p1原本指向的值,再判断sum和target大小。

这种两个 指针向同一个方向移动,p1p2的范围就像窗口一样,在数组上移动,它可以是动态的,也可以是固定的。

1.left right窗口范围

2.进窗口

3.判断

4.出窗口

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

⽆重复字符的最⻓⼦串(medium)

https://leetcode.cn/problems/longest-substring-without-repeating-characters/

思路:从第一个字符开始,到最后一个字符,一个一个算不重复的最长子字符串。

确实可以算但可以进行优化,

eg. de abc abcdefj  从第一个字符算 最长子字符串deabc,从第二个算eabc 第三个abc 

可以看到不重复子字符串的长度是不断变小的,因为只要子字符串中还包含a也就是重复的字符,就不可能增加。

所以用滑动窗口时,从左到右不断进窗口,等到出现重复字符时,先更新,再不断出窗口,直到把重复字符删除。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> charSet;
        int len=0;
        int left=0;
        for(int right=0;right<(int)s.size();right++)
        {
            while(charSet.find(s[right])!=charSet.end())//判断
            {
               charSet.erase(s[left]);//出窗口
               left++;
            }
            len=max(len,right-left+1);//更新结果
            charSet.insert(s[right]);//入窗口
        }
        return len;
    }
};
  
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128];
        int re=0;
        int left=0,right=0;
        while(right<s.size())
        {
            hash[s[right]]++;   //入窗口
            if(hash[s[right]]>1)//已经存在 出窗口直到只存在一种该字母
            {
                while(hash[s[right]]!=1)
                {
                    hash[s[left++]]--;
                }
            }
            //记录结果
            re=max(re,right-left+1);
            //遍历下一个
            right++;
        }
        return re;
    }
};

将x减到0的最⼩操作数(medium)

. - 力扣(LeetCode)

如果从正面想会有困难,可以用逆向思维想一想。

从左右两边找最少的数==x,也就是从中间找最多的数==数组和-x

就转成找最长字符串问题,可以用滑动窗口解决。

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int sum=0,ret=-1;
        int left=0,right=0;
        for(auto &o:nums) sum+=o;
        sum-=x;
        //数组和小于x
        if(sum<0) return -1;
        //if(sum==0) return (int)nums.size();
        for(int k=0;right<(int)nums.size();right++)
        {
            k+=nums[right];
            while(k>sum)
            {
                k-=nums[left++];
            }
            if(k==sum)  ret=max(ret,right-left+1);
        }
        return ret==-1?-1:(int)nums.size()-ret;
    }
};

ret=0;

return ret==0?-1:(int)nums.size()-ret;

改成这样可以吗?

为什么出错?
当数组和==x时,此时每次循环结束前left都++,right循环结束后才能++,那么当right指向最后一个元素,left就已经指向最后一个元素后面。当算ret=max(ret,right-left+1) 相当于max(0,0)。结果ret==0,这种情况和没有找到的情况重合,所以ret设为-1可以区别开来。

或者直接加上if(sum==0) return (int)nums.size(); 先把数组和相等的情况排除。

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

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

相关文章

【无标题】linux

Linux工具快速教程 Linux 基础 Linux工具快速教程1、使用命令帮助1.1 查看命令的简要说明1.2 查看路径 2. 文件及目录2.1 创建和删除2.2 切换目录2.3 列出目录项2.4 查找文件或目录 find2.5 查看文件内容2.6 查找文件内容 好用小工具linux工具电源统计1. 查询公网IPhttp://www.…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 &#xff08;1&#xff09;在国家方面&#xff0c;是国产的系统&#xff0c;受国家支持不会有限制的情况。   &#xff08;2&#xff09;设备互连18N(1:手机 8&#xff1a;平板、PC、vr设备、可穿戴设备、智慧…

关于物联网的基础知识(一)

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;一&a…

基于Thinkphp6+uniapp的陪玩陪聊软件开发方案分析

使用uni-app框架进行前端开发。uni-app是一个使用Vue.js开发所有前端应用的框架&#xff0c;支持一次编写&#xff0c;多端发布&#xff0c;包括APP、小程序、H5等。 使用Thinkphp6框架进行后端开发。Thinkphp6是一个轻量级、高性能、面向对象的PHP开发框架&#xff0c;具有易…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件&#xff0c;缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下&#xff1a;需要添加git库地址&#xff0c;和登录git的用户密码 配置好后执行编译&#xff0c;成功后拉取的代码在工作空间里

idea全局替换显示不全(ctrl+shift+R)

修改一下idea的配置就行 idea的默认显示条数为100&#xff0c;可以修改成10000

Ubuntu 下测试 NVME SSD 的读写速度

在 Ubuntu 系统下&#xff0c;测试 NVME SSD 的读写速度&#xff0c;有好多种方法&#xff0c;常用的有如下几种&#xff1a; 1. Gnome-disks Gnome-disks&#xff08;也称为“Disks”&#xff09;是 GNOME 桌面环境中的磁盘管理工具&#xff0c;有图形界面&#xff0c;是测试…

AI投资分析:用于股票评级的大型语言模型(LLMs)

“AI in Investment Analysis: LLMs for Equity Stock Ratings” 论文地址&#xff1a;https://arxiv.org/pdf/2411.00856 摘要 投资分析作为金融服务领域的重要组成部分&#xff0c;LLMs&#xff08;大型语言模型&#xff09;为股票评级带来了改进的潜力。传统的股票评级方式…

基于CLIP和DINOv2实现图像相似性方面的比较

概述 在人工智能领域&#xff0c;CLIP和DINOv2是计算机视觉领域的两大巨头。CLIP彻底改变了图像理解&#xff0c;而DINOv2为自监督学习带来了新的方法。 在本文中&#xff0c;我们将踏上一段旅程&#xff0c;揭示定义CLIP和DINOv2的优势和微妙之处。我们的目标是发现这些模型…

【学习笔记】数据结构(十)

内部排序 文章目录 内部排序10.1 概述10.2 插入排序10.2.1 直接插入排序10.2.2 其他插入排序10.2.2.1 折半插入排序(Binary Insertion Sort)10.2.2.2 2-路插入排序&#xff08;Two-Way Insertion Sort&#xff09;10.2.2.3 表插入排序&#xff08;Table Insertion Sort&#xf…

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画&#xff0c;我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡&#xff0c;这样虽然能完成功能&#xff0c;但是如…

Ubuntu20.04中安装ns-3.36及遇到的问题

一、安装虚拟机&#xff1a;VMware 17.5 参考教程&#xff1a;VMware17Pro虚拟机安装教程(超详细)-CSDN博客 博主&#xff1a;七维大脑 遇到的问题&#xff1a; Q1&#xff1a;安装ubuntu系统时&#xff0c;页面看不到”继续“选项&#xff0c;无法进行下一步 A&#xff…

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…

人大金仓实现主键自增.

使用数据库中自带的参数类型 serial 类型(相当于创建一个INT列), 或者bigserial(相当于创建一个BIGINT列. 示例sql: CREATE TABLE ord(id SERIAL,ord_no INT NOT NULL,ord_name VARCHAR(32),CONSTRAINT "ord_PKEY" PRIMARY KEY ("id"));插入时指定自增值…

React Router 向路由组件传state参数浏览器回退历史页面显示效果问题

昨天在看尚硅谷张天禹老师讲的 React教程p90&#xff0c;老师讲到 React路由的 replace模式和push模式&#xff0c;老师的演示效果与自己本地操作不太一样。 老师的效果&#xff1a;点击查看消息1&#xff0c;消息2&#xff0c;消息3 再点回退&#xff0c;可以依次查看到 消息…

selenium无法定位元素的几种解决方案

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位&#xff0c;对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法&#xff1a; d…

SSM-Spring-IOC/DI注解开发

目录 IOC/DI注解开发 1 注解开发定义bean 2 纯注解开发模式 步骤 Bean的作用范围 Bean生命周期 3 注解开发依赖注入 Autowired 注解实现按照名称注入 简单数据类型注入 注解读取properties配置文件 4 IOC/DI 注解开发管理第三方bean 4.1 步骤&#xff08;以管理第三…

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践

引言 在 Android 开发中&#xff0c;AlarmManager 是一个非常重要的系统服务&#xff0c;用于设置定时任务或者周期性任务。无论是设置一个闹钟&#xff0c;还是定时进行数据同步&#xff0c;AlarmManager 都是不可或缺的工具之一。然而&#xff0c;随着 Android 系统的不断演…

接口开发完后,个人对于接下来接口优化的一些思考

优化点 入参的合法性和长度范围&#xff0c;必填项的检查验证 因为没有入参&#xff0c;所以不需要考虑。 批量思想解决N1问题 // 假设要查询100个订单及其对应的用户信息 List<Order> orders orderMapper.selectList(new QueryWrapper<>().last("limit …