[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解

本文主要是介绍[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.无重复字符的最长字串
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.最大连续的一个数 Ⅲ
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.将x减到0的最小操作数
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.无重复字符的最长字串

1.题目链接

  • 无重复字符的最长字串

2.算法原理详解

  • 研究的对象依旧是⼀段连续的区间,因此继续使⽤「滑动窗⼝」思想来优化
    • 滑动窗口 + 哈希表(判断字符是否重复出现)
  • 让滑动窗⼝满⾜:窗⼝内所有元素都是不重复的
  • 做法:右端元素s[right]进⼊窗⼝的时候,哈希表统计这个字符的频次
    • 如果这个字符出现的频次超过1 ,说明窗⼝内有重复元素
      • 那么就从左侧开始划出窗⼝, 直到s[right]这个元素的频次变为1,然后再更新结果
    • 如果没有超过1,说明当前窗⼝没有重复元素,可以直接更新结果
      请添加图片描述

3.代码实现

int LengthOfLongestSubstring(string s) 
{int n = s.size(); int ret = 0;int hash[128] = { 0 }; // 利用hash查重for(int left = 0, right = 0; right < n; right++){hash[s[right]]++; // 入窗口while(hash[s[right]] > 1){hash[s[left++]]--; // 出窗口}ret = max(ret, right - left + 1); // 更新结果}return ret;
}

2.最大连续的一个数 Ⅲ

1.题目链接

  • 最大连续的一个数 Ⅲ

2.算法原理详解

  • 不要去想怎么翻转,不要把问题想的很复杂
    • 这道题的结果⽆⾮就是⼀段连续的1中间塞了k个0
  • 问题转化为:子数组内,0的个数不超过k
    • 既然是连续区间,可以考虑使⽤**「滑动窗⼝」**来解决问题
  • 做法:当right < nums.size()时,⼀直下列循环:
    • 让当前元素进⼊窗⼝
      • 1 -> 无视
      • 0 -> zero++
    • 检查0的个数是否超标
      • 如果超标,依次让左侧元素滑出窗⼝
      • 顺便更新zero的值,直到0的个数恢复正常
    • 程序到这⾥,说明窗⼝内元素是符合要求的,更新结果
    • right++,处理下⼀个元素
      请添加图片描述

3.代码实现

int LongestOnes(vector<int>& nums, int k) 
{// 问题转化为,子数组内,0的个数不超过kint ret = 0;for(int left = 0, right = 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);}return ret;
}

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

1.题目链接

  • 将x减到0的最小操作数

2.算法原理详解

  • 要求是数组「左端+右端」两段连续的、和为x的最短数组
    • 可以转化成求数组内⼀段连续的、和为sum(nums) - x的最⻓数组
      • 即:将两端转化为中间连续
    • 此时,就是熟悉的**「滑动窗⼝」**问题了
  • 做法
    • 转化问题:求target = sum(nums) - x
      • 如果target < 0,问题⽆解
    • 初始化左右指针left = 0, right = 0(滑动窗⼝区间表⽰为 [ l , r ) [l, r) [l,r)
      • 左右区间是否开闭很重要,必须设定与代码⼀致
      • 记录当前滑动窗⼝内数组和的变量sum = 0
      • 记录当前满⾜条件数组的最⼤区间⻓度len = -1
    • right < nums.size()时,⼀直循环:
      • if sum < target
        • right++,直⾄sum >= target ,或right已经移到头
      • if sum > target
        • left++,直⾄sum <= target ,或left已经移到头
      • 如果经过前两步的左右移动使得sum == target
        • 维护满⾜条件数组的最⼤⻓度,并让下个元素进⼊窗⼝
          请添加图片描述

3.代码实现

int MinOperations(vector<int>& nums, int x) 
{// 将模型转化为最长子数组的和 == (sumNum - x)int sum = 0, ret = -1;int target = -x;for(auto& e : nums){target += e;}// 细节处理,当target为负数时,怎么减都减不够if(target < 0){return -1;}for(int left = 0, right = 0; right < nums.size(); right++){sum += nums[right]; // 入窗口while(sum > target) // 判断{sum -= nums[left++]; // 出窗口}if(sum == target){ret = max(ret, right - left + 1); // 更新结果}}return ret == -1 ? -1 : nums.size() - ret;
}

这篇关于[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.