【12.22】转行小白历险记-算法01

不会算法的小白不是好小白,可恶还有什么可以难倒我这个美女的,不做花瓶第一天

一、长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode)

1.思路

滑动窗口法:把数组的区间,假设成为两个指针,先后移动两个指针

我们先读懂题目,这个很重要,不过我现在读的不是很懂,没事美女有弱点可以理解

2.辅助理解的例子(没办法罗,思路不过脑子只能解析一下)

let transactions = [1, 2, 3, 4, 5];

目标是找到一个连续的子数组,其元素总和至少为 9

let target = 9;
let result = minSubArrayLen(target, transactions);

1.初始设置

transactions = [1, 2, 3, 4, 5]
target = 9
start = 0, end = 0
sum = 0
ans = Infinity

2.迭代过程

  1. 第一轮迭代: end = 0

    • sum = 1 (1)
    • sum < target (9),所以 end++
  2. 第二轮迭代: end = 1

    • sum = 3 (1 + 2)
    • sum < target,所以 end++
  3. 第三轮迭代: end = 2

    • sum = 6 (1 + 2 + 3)
    • sum < target,所以 end++
  4. 第四轮迭代: end = 3

    • sum = 10 (1 + 2 + 3 + 4)
    • sum >= target:
      • Math.min(ans, end - start + 1) -> Math.min(Infinity, 4 - 0 + 1) -> ans = 4
      • sum -= nums[start]start++ -> sum = 9 (2 + 3 + 4), start = 1
  5. 第五轮迭代: end = 3

    • sum = 9 (2 + 3 + 4)
    • sum >= target:
      • Math.min(ans, end - start + 1) -> Math.min(4, 4 - 1 + 1) -> ans = 3
      • sum -= nums[start]start++ -> sum = 7 (3 + 4), start = 2
  6. 接下来的迭代

    • end 继续增加,但不再找到总和大于等于 target 的更短子数组。

3结果

  • 最终,ans 的值为 3
  • 函数返回 3,表示最短的满足条件的子数组长度是 3(即 [2, 3, 4])。

很好这个滑动窗口是这样理解了,但是不会活学活用,那么下面继续

二.水果成篮

904. 水果成篮 - 力扣(LeetCode)

很抽象我读不懂题目:找了一个外援理解了一下题目

人话:我们的目标是找到一个窗口,其中只包含两种类型的水果,并且这个窗口尽可能大

步骤

  1. 初始化: 定义两个变量来跟踪窗口的开始和结束位置。同时,使用一个数据结构(如哈希表)来跟踪窗口内不同水果的数量。

  2. 扩大窗口: 从左向右移动窗口的右边界,即不断添加新的水果到窗口中,同时更新哈希表。

  3. 满足条件的窗口: 当窗口中包含超过两种水果时,移动窗口的左边界以排除一种水果,直到窗口重新只包含两种水果。

  4. 记录结果: 在每次更新窗口时,如果窗口只包含两种水果,更新最大收集水果的数量。

  5. 重复直到结束: 继续扩大和缩小窗口,直到覆盖了整个数组。

例子

假设 fruits = [1, 2, 1, 2, 3],我们可以按以下步骤使用滑动窗口法:

  • 开始: 窗口为空,最大数量为 0。
  • 窗口扩大: 添加 1,窗口为 [1],最大数量为 1。
  • 窗口扩大: 添加 2,窗口为 [1, 2],最大数量为 2。
  • 窗口扩大: 添加 1,窗口为 [1, 2, 1],最大数量为 3。
  • 窗口扩大: 添加 2,窗口为 [1, 2, 1, 2],最大数量为 4。
  • 窗口扩大: 添加 3,窗口为 [1, 2, 1, 2, 3]。现在窗口中有三种水果,需要缩小窗口。
  • 缩小窗口: 移除窗口左边的 1,窗口变为 [2, 1, 2, 3]。依然有三种水果,继续缩小。
  • 缩小窗口: 移除窗口左边的 2,窗口变为 [1, 2, 3]。现在窗口中有两种水果,最大数量更新为 3。

最终,最大收集的水果数量为 4(在添加第四个水果之前)。

初始设置

  • basket = {}: 用来存储水果的类型和数量。
  • start = 0: 窗口的开始位置。
  • maxFruits = 0: 可以收集的最大水果数。
  • fruits = [1, 2, 1, 2, 3]: 待处理的水果数组。

迭代过程

  1. 第一次迭代 (end = 0):

    • fruit = fruits[0] = 1
    • basket = {1: 1}
    • maxFruits = Math.max(0, 0 - 0 + 1) = 1
  2. 第二次迭代 (end = 1):

    • fruit = fruits[1] = 2
    • basket = {1: 1, 2: 1}
    • maxFruits = Math.max(1, 1 - 0 + 1) = 2
  3. 第三次迭代 (end = 2):

    • fruit = fruits[2] = 1
    • basket = {1: 2, 2: 1}
    • maxFruits = Math.max(2, 2 - 0 + 1) = 3
  4. 第四次迭代 (end = 3):

    • fruit = fruits[3] = 2
    • basket = {1: 2, 2: 2}
    • maxFruits = Math.max(3, 3 - 0 + 1) = 4
  5. 第五次迭代 (end = 4):

    • fruit = fruits[4] = 3
    • basket = {1: 2, 2: 2, 3: 1}
    • 现在 basket 中有三种水果。需要移动 start 来删除一种水果。
    • 移动 startbasket = {1: 1, 2: 2, 3: 1}
    • 继续移动 startbasket = {2: 2, 3: 1}
    • maxFruits = Math.max(4, 4 - 1 + 1) = 4

结果

函数最终返回 maxFruits = 4。这意味着最长的符合规则的连续子数组是 [1, 2, 1, 2],其长度为 4。

三、最小覆盖子串

76. 最小覆盖子串 - 力扣(LeetCode)

辅助笨蛋美女理解的例子

初始设置

  • s = "ADOBECODEBANC"
  • t = "ABC"
  • 初始化窗口的左右指针:l = 0, r = 0
  • 窗口中符合条件的字符数量:formed = 0
  • 记录 t 中字符出现频率的哈希表 tFreq
  • 记录窗口中字符出现频率的哈希表 windowCounts
  • 最小子串的长度:minLength = Infinity
  • 最小子串的起始索引:minLeft = 0

迭代过程

  1. 初始化 tFreq:

    • tFreq = {'A': 1, 'B': 1, 'C': 1}
  2. 第一次迭代 (r = 0):

    • 当前字符 s[r] = 'A'
    • windowCounts = {'A': 1}
    • formed = 1(因为 'A' 是 t 的一部分)
    • r++
  3. 第二次迭代 (r = 1):

    • 当前字符 s[r] = 'D'
    • windowCounts = {'A': 1, 'D': 1}
    • formed 保持不变
    • r++
  4. 第三次迭代 (r = 2):

    • 当前字符 s[r] = 'O'
    • windowCounts = {'A': 1, 'D': 1, 'O': 1}
    • formed 保持不变
    • r++
  5. 第四次迭代 (r = 3):

    • 当前字符 s[r] = 'B'
    • windowCounts = {'A': 1, 'D': 1, 'O': 1, 'B': 1}
    • formed = 2(因为 'B' 是 t 的一部分)
    • r++
  6. 第五次迭代 (r = 4):

    • 当前字符 s[r] = 'E'
    • windowCounts = {'A': 1, 'D': 1, 'O': 1, 'B': 1, 'E': 1}
    • formed 保持不变
    • r++
  7. 第六次迭代 (r = 5):

    • 当前字符 s[r] = 'C'
    • windowCounts = {'A': 1, 'D': 1, 'O': 1, 'B': 1, 'E': 1, 'C': 1}
    • formed = 3('C' 是 t 的一部分,现在窗口包含所有 t 的字符)
    • 开始尝试缩小窗口 (l 开始移动):
      • 移动 l 直到 formed 减少
      • l 停在 3('B' 处),此时窗口是 "ADOBEC",长度为 6
      • minLength = 6, minLeft = 0
  8. 继续迭代:

    • 继续移动 rl,寻找更小的覆盖子串
    • 每当 formed 达到 3 时,尝试缩小窗口并更新 minLengthminLeft

结果

  • 经过迭代,找到最小覆盖子串 "BANC"(长度为 4,起始索引为 9
  • 函数返回 "BANC"

每次迭代都会检查当前窗口是否包含了 t 中的所有字符。

美女不懂的地方,反思理解到了

缩小窗口的具体步骤

假设我们有字符串 s = "ADOBECODEBANC"t = "ABC",并且我们已经通过向右移动右指针 r 扩展了窗口,直到它包含了 t 中的所有字符。目前的窗口是 "ADOBEC"(从索引 05)。

  1. 缩小窗口:

    • 我们现在尝试通过向右移动左指针 l 来缩小窗口。每移动一次 l,窗口中包含的字符数量就会相应减少。
  2. 维护 formed 条件:

    • formed 变量用来跟踪窗口中是否包含了 t 中的所有字符。
    • 在这个例子中,当窗口包含 A, B, C 各至少一次时,formed 条件为满足状态。
  3. 移动 l 直到 formed 减少:

    • 开始逐个移除窗口左侧的字符,并检查每次移除后窗口是否仍然满足 formed 条件。
    • 在这个例子中,当左指针 l 移到 3 的位置时(即字符 B),窗口为 "BEC"(去掉了 ADO)。这时,窗口不再包含 t 中的所有字符(A 被移除了),所以 formed 条件不再满足。
  4. 更新最小子串信息:

    • 在移动 l 之前,如果当前窗口满足条件,我们检查它是否比之前记录的最小窗口更小。
    • 在这个例子中,窗口 "ADOBEC" 的长度为 6,这是目前找到的满足条件的最小窗口。因此,minLength 更新为 6minLeft 更新为窗口的起始索引 0

通过以上步骤,我们找到了一个满足条件的子串 "ADOBEC"。但算法不会停止,它会继续尝试找到可能存在的更小的满足条件的子串,直到遍历完整个字符串 s。最终的答案在这个例子中是 "BANC"

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

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

相关文章

stm32项目(14)——基于stm32f103zet6的循迹避障小车

1.功能设计 stm32循迹避障小车&#xff0c;使用超声波测距&#xff0c;使用红外循迹模块追踪黑线&#xff0c;实现循迹功能。此外&#xff0c;还可以检测烟雾、火焰、人体、温湿度。温湿度显示在LCD屏幕上。检测到有人、有火焰、有烟雾时&#xff0c;蜂鸣器报警&#xff01; 功…

强化学习(五)-Deterministic Policy Gradient (DPG) 算法及公式推导

针对连续动作空间&#xff0c;策略函数没法预测出每个动作选择的概率。因此使用确定性策略梯度方法。 0 概览 1 actor输出确定动作2 模型目标&#xff1a; actor目标&#xff1a;使critic值最大 critic目标&#xff1a; 使TD error最大3 改进&#xff1a; 使用两个target 网络…

Ceph存储体系架构?

Ceph体系架构主要由RADOS和RADOS GW和RBD以及CephFS构成。 RADOS&#xff08;Reliable, Autonomic Distributed Object Store&#xff09;是Ceph的底层核心&#xff0c;RADOS本身也是分布式存储系统&#xff0c;CEPH所有的存储功能都是基于RADOS实现。RADOS由两个组件组成&…

【接口测试】JMeter调用JS文件实现RSA加密

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Vue.js实战:构建现代单页应用程序(SPA)的实用指南

欢迎来到《Vue.js实战指南》&#xff01;本博客将深入探讨如何通过Vue.js构建现代单页应用程序&#xff08;SPA&#xff09;。无论你是初学者还是有一定经验的开发者&#xff0c;这里都有关键的实用指南&#xff0c;帮助你从概念到实际应用中构建强大的SPA。准备好迎接Vue.js的…

SQL分类

SQL分类 DDL 查询库 查询表 创建表 修改表 DML 添加数据 修改数据 删除数据 DQL 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 执行顺序 DCL 管理用户 管理权限 数据类型 数值类型 字符串类型 日期类型

【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【模拟】2023C-结队编程【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 某部门计划通过结队编程来进行项目开发&#xff0c;已知该部门有 N 名员工…

startUML6.0.1破解方法

startUML6.0.1破解方法 文章目录 startUML6.0.1破解方法1.startUML6.0.1快速破解2.概述3.安装Nodejs4.安装asar5.修改app.asar中的源码6.将修改后的源码重新压缩7.覆盖官方的asar文件8.重启startUML9.参考文档 1.startUML6.0.1快速破解 后绪步骤可以不看&#xff0c;直接下载我…

使用@jiaminghi/data-view实现一个数据大屏

<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…

1162字符串逆序

一&#xff1a;题目 二.思路分析 1.如果不用递归&#xff0c;可以输入字符串后&#xff0c;再逆序输出&#xff0c;但是题目要求使用递归 2.使用递归&#xff1a; 2.1输入字符&#xff0c;直到输入的字符是‘&#xff01;’&#xff0c;停止输入&#xff0c;否则继续输入&…

自学华为鸿蒙开发?一般人我还是劝你算了吧!!!

本人纯屌丝一枚&#xff0c;在学编程之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学鸿蒙开发&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&#xff0c;…

Java八股文面试全套真题【含答案】- MyBatis Plus 篇

MyBatis Plus 是什么&#xff1f;它与 MyBatis 有什么区别&#xff1f; 答&#xff1a;MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架&#xff0c;它提供了一系列增强功能&#xff0c;简化了 MyBatis 的使用。与 MyBatis 相比&#xff0c;MyBatis Plus 提供了更多的便…

【vscode插件】之点击指令,顶部弹出输入框 可以输入指令,获取输入的内容

ChatgGPT4.0国内站点: 海鲸AI-支持AI会话&#xff0c;文件分析&#xff0c;AI绘图 在Visual Studio Code&#xff08;VSCode&#xff09;中创建一个插件&#xff0c;使得当用户点击一个指令时&#xff0c;顶部会弹出一个输入框并允许用户输入内容&#xff0c;可以通过使用VSCo…

win10下使用fastdds

参照网址&#xff1a;https://www.cnblogs.com/edkong/p/16522836.html 需要安装的软件和用处&#xff1a; Visual Studio&#xff0c;用于打开和编译fastdds示例工程。下载地址&#xff1a;下载 Visual Studio Tools - 免费安装 Windows、Mac、LinuxCmake&#xff0c;用于将…

【String str = new String(“hollis“) 创建了几个对象?】

✅典型解析 创建的对象数应该是1个或者2个。 首先要清楚什么是对象? Java是一种面向对象的语言&#xff0c;而Java对象在JVM中的存储也是有一定的结构的&#xff0c;在HotSpot虚机中&#xff0c;存储的形式就是oop-klass model&#xff0c;即ava对象模型。我们在Java代码中&am…

FastGPT+ChatGLM3-6b搭建知识库

前言&#xff1a;我用fastgpt直接连接chatglm3&#xff0c;没有使用oneai&#xff0c;不是很复杂&#xff0c;只需要对chatglm3项目代码做少量修改就能支持使用embeddings&#xff0c;向量模型用的m3e&#xff0c;效果还可以 我的配置&#xff1a; 处理器&#xff1a;i5-13500 …

VideoPoet: Google的一种用于零样本视频生成的大型语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【C++进阶02】多态

一、多态的概念及定义 1.1 多态的概念 多态简单来说就是多种形态 同一个行为&#xff0c;不同对象去完成时 会产生出不同的状态 多态分为静态多态和动态多态 静态多态指的是编译时 在程序编译期间确定了程序的行为 比如&#xff1a;函数重载 动态多态指的是运行时 在程序运行…

【Java异常】聊聊异常可能带来的坑

一个活生生的案例 本周帮同事排查了一个问题&#xff0c;比较诡异的是他通过测试&#xff0c;并没有找到根本原因&#xff0c;只是发现有对应的错误日志。 但是其实并没有将堆栈信息打印出来。很难看出问题。添加了 e.printStackTrace(); get exception in exter: / by zero显…

Electron执行本地cmd命令

javascript执行本地cmd命令,javascript代码怎么执行_js调用本机cmd-CSDN博客 使用 Node.js 打开本地应用_nodejs启动应用-CSDN博客 笔记:nodejs脚本唤醒本地应用程序或者调用命令-CSDN博客 electron调起本地应用_electron 调用本地程序-CSDN博客 命令行打开vscode 你可以使用…