学习记录:js算法(二十):子数组最大平均数 I、无重复字符的最长子串

文章目录

    • 子数组最大平均数 I
      • 我的思路
      • 网上思路
    • 无重复字符的最长子串
      • 我的思路
      • 网上思路
    • 总结

子数组最大平均数 I

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案。

示例 1:
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75示例 2:
输入:nums = [5], k = 1
输出:5.00000

我的思路
循环
网上思路
滑动窗口

我的思路

var findMaxAverage = function (nums, k) {let maxAverage = -Infinity;const n = nums.length;for (let i = 0; i <= n - k; i++) {let currentSum = 0;for (let j = i; j < i + k; j++) {currentSum += nums[j];}const currentAverage = currentSum / k;maxAverage = Math.max(maxAverage, currentAverage);}return maxAverage;
}

讲解
首先初始化 maxAverage 为负无穷,这样任何计算的平均数都能更新它。
然后循环:
- 外层循环 从 0 到 n - k ,用于确定每个子数组的起始位置。
- 内层循环 从 i 到 i + k ,用于计算当前子数组的和,将当前子数组的元素逐一相加,得到 currentSum
通过 currentSum / k 计算当前子数组的平均数。
使用 Math.max 更新 maxAverage,确保它始终保持最大的平均值。

网上思路

var findMaxAverage = function (nums, k) {// 计算前 k 个元素的和let currentSum = 0;for (let i = 0; i < k; i++) {currentSum += nums[i];}let maxSum = currentSum;// 滑动窗口for (let i = k; i < nums.length; i++) {currentSum += nums[i] - nums[i - k]; // 更新窗口和maxSum = Math.max(maxSum, currentSum); // 更新最大和}// 计算最大平均数return maxSum / k;
}

讲解

  1. 初始窗口和计算:
    我们首先计算数组的前 k 个元素的和,这样我们就有了一个初始的窗口和。
    例如,对于数组 nums = [1, 12, -5, -6, 50, 3]k=4 ,我们计算前 4 个元素的和:1 + 12 - 5 - 6 = 2
  2. 滑动窗口:
    从第 k 个元素开始,我们逐步向右滑动窗口。每次滑动时,我们需要更新当前窗口的和:
    • 移除最左边的元素:当窗口向右滑动时,最左边的元素会被移出窗口。
    • 移除最左边的元素:当窗口向右滑动时,最左边的元素会被移出窗口。
      这可以通过 currentSum += nums[i] - nums[i - k] 来实现。这里 nums[i] 是新加入的元素,而 nums[i - k] 是被移除的元素。
  3. 更新最大和:
    在每一步中,我们将当前窗口的和与之前记录的最大和进行比较。如果当前和更大,就更新最大和。
    例如,在第二次滑动时,我们可能会计算新的窗口和 12 - 5 - 6 + 50 = 51,然后更新最大和。
  4. 计算平均数:
    一旦我们遍历完所有可能的窗口,最大和就被记录下来了。最后,我们只需将这个最大和除以
    k 就能得到最大平均数。

无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

示例 1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

我的思路
循环
网上思路
滑动窗口

我的思路

var lengthOfLongestSubstring = function (s) {let maxLength = 0;for (let i = 0; i < s.length; i++) {let charSet = new Set();let currentLength = 0;for (let j = i; j < s.length; j++) {if (charSet.has(s[j])) {break;}charSet.add(s[j]);currentLength++;}maxLength = Math.max(maxLength, currentLength);}return maxLength;
};

讲解
maxLength 用于记录最长子串的长度。
外层循环 从 0 到 s.length - 1,用于确定每个子串的起始位置。
内层循环从当前的起始位置 i 开始,逐个检查字符。

  • 使用一个集合 charSet 来存储当前子串中的字符。
  • 如果当前字符 s[j] 已经在集合中,表示有重复字符,使用 break 语句退出内层循环。
  • 如果没有重复字符,将当前字符添加到集合,并增加 currentLength
    在内层循环结束后,使用 Math.max 更新 maxLength
    最后返回 maxLength

网上思路

var lengthOfLongestSubstring = function (s) {let left = 0; // 左指针let maxLength = 0; // 最长子串的长度const charSet = new Set(); // 用于存储当前窗口中的字符for (let right = 0; right < s.length; right++) {// 如果字符重复,移动左指针,直到没有重复字符while (charSet.has(s[right])) {charSet.delete(s[left]);left++;}// 添加当前字符到集合charSet.add(s[right]);// 更新最长子串的长度maxLength = Math.max(maxLength, right - left + 1);}return maxLength; // 返回最长子串的长度
};

讲解

  1. 初始化:
    left 指针从 0 开始,maxLength 初始化为 0,集合 charSet 用于存储当前窗口的字符。
  2. 滑动窗口:
    right 指针遍历字符串的每个字符。
    如果当前字符 s[right] 已经在集合中,表示有重复字符,进入内层 while 循环,移动 left 指针并从集合中删除字符,直到没有重复字符。
  3. 更新集合和长度:
    将当前字符添加到集合中。
    更新 maxLength 为当前窗口的长度 right - left + 1
  4. 返回结果:
    最后返回 maxLength,即不含重复字符的最长子串的长度。

总结

第一次遇见滑动窗口这一说法,虽然不是很难理解,但是用循环不香吗?

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

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

相关文章

QT实战项目之音乐播放器

项目效果演示 myMusicShow 项目概述 在本QT音乐播放器实战项目中&#xff0c;开发环境使用的是QT Creator5.14版本。该项目实现了音乐播放器的基本功能&#xff0c;例如开始播放、停止播放、下一首播放、上一首播放、调节音量、调节倍速、设置音乐播放模式等。同时还具备搜索功…

Centos 下载和 VM 虚拟机安装

1. Centos 下载 阿里云下载地址 centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2. VM 中创建 Centos 虚拟机 2.1 先打开 VM 虚拟机&#xff0c;点击首页的创建新的虚拟机 2.2 选择自定义&#xff0c;然后点击下一步。 2.3 这里默认就好&#xff0c;继续选择下一…

docker加速配置 daemon.json

配置docker 加速 提高下载速度 在某些地区&#xff0c;尤其是中国&#xff0c;Docker Hub 的访问速度可能较慢&#xff0c;导致镜像下载时间过长。通过配置加速器&#xff0c;可以显著提高镜像的拉取速度&#xff0c;减少等待时间。 减少网络不稳定带来的影响 网络不稳定可能导…

gitlab SSH的使用

一、 安装git bash https://git-scm.com/download/win 下载windows 版本&#xff0c;默认安装即可。 二、使用命令 打开本地git bash,使用如下命令生成ssh公钥和私钥对 ssh-keygen -t rsa -C ‘xxxxxx.com’ 然后一路回车 (-C 参数是你的邮箱地址) 若是想输入密码可以输入…

算法-最长连续序列

leetcode的题目链接 这道题的思路主要是要求在O&#xff08;n)的时间复杂度下&#xff0c;所以你暴力解决肯定不行&#xff0c;暴力至少两层for循环&#xff0c;所以要在O&#xff08;n)的时间复杂度下&#xff0c;你可以使用HashSet来存储数组&#xff0c;对于每个数字&#…

黑马JavaWeb开发笔记07——Ajax、Axios请求、前后端分离开发介绍、Yapi详细配置步骤

文章目录 前言一、Ajax1. 概述2. 作用3. 同步异步4. 原生Ajax请求&#xff08;了解即可&#xff09;5. Axios&#xff08;重点&#xff09;5.1 基本使用5.2 Axios别名&#xff08;简化书写&#xff09; 二、前后端分离开发1. 介绍1.1 前后台混合开发1.2 前后台分离开发方式&…

Docker续6:容器网络

1.bridge-utils 一个用于Linux系统的网络桥接工具集。它提供了一些命令行工具&#xff0c;帮助用户创建、管理和配置网络桥接。网络桥接是一种将多个网络接口连接在一起&#xff0c;以使它们能够作为单个网络段进行通信的技术。 bridge-utils 常用的命令包括&#xff1a; b…

【 OpenHarmony 系统应用源码魔改 】-- Launcher 之「桌面布局定制」

前言 阅读本篇文章之前&#xff0c;有几个需要说明一下&#xff1a; 调试设备&#xff1a;平板&#xff0c;如果你是开发者手机&#xff0c;一样可以加 Log 调试&#xff0c;源码仍然是手机和平板一起分析&#xff1b;文章中的 Log 信息所显示的数值可能跟你的设备不一样&…

单片机编程魔法师-并行多任务程序

程序架构 程序代码 小结 数码分离&#xff0c;本质上就是将数据和代码逻辑进行分离&#xff0c;跟第一章使用数据驱动程序一样的道理。 不过这里不同之处在于。这里使用通过任务线程&#xff0c;但是却有2个任务在运行&#xff0c;两个任务都通过先初始化任务数据参数&#x…

this.$nextTick() 是 Vue.js 提供的一个方法

this.$nextTick() 是 Vue.js 提供的一个方法&#xff0c;用于在 DOM 更新完成后执行指定的代码。它的作用主要是确保在 Vue.js 完成 DOM 更新后&#xff0c;再执行某些依赖于更新的操作。这个方法通常用于处理需要在视图更新后立即进行的操作&#xff0c;如获取最新的 DOM 元素…

SQLite的安装和使用

一、官网链接下载安装包 点击跳转 步骤&#xff1a;点击安装这个红框的dll以及红框下面的tools &#xff08;如果有navicat可以免上面这个安装步骤&#xff0c;安装上面这个是为了能在命令行敲SQL而已&#xff09; 二、SQLite的特点 嵌入的&#xff08;无服务器的&#x…

使用MCP2518FD在STM32G4上实现SPI转CAN通信

在汽车电子和工业控制系统中&#xff0c;CAN&#xff08;Controller Area Network&#xff09;总线是一种广泛使用的通信协议。MCP2518FD是一款由Microchip生产的CAN控制器&#xff0c;它支持SPI通信接口&#xff0c;非常适合与STM32等微控制器配合使用。本文将介绍如何在STM32…

hello树先生——AVL树

AVL树 一.什么是AVL树二.AVL树的结构1.AVL树的节点结构2.插入函数3.旋转调整 三.平衡测试 一.什么是AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。…

智能合约漏洞(四)

前言 在前面的文章中&#xff0c;我们讨论了整数溢出/下溢和时间依赖漏洞。今天&#xff0c;我们将继续探讨智能合约中两种常见的安全问题&#xff1a;拒绝服务&#xff08;Denial of Service, DoS&#xff09;和恶意合约依赖漏洞。这些漏洞可能导致合约功能的中断或意外的恶意…

python学习——爬虫之session请求处理cookie

import requestssessionrequests.session() url"https://passport.17k.com/ck/user/login" data{"loginName": "19139186287","password":"2001022600hzk"} ressession.post(url,datadata) print(res.text)# session通过会话…

Windows系统中批量管理Windows服务器远程桌面工具——RDCMan

一、背景 在公司没有部署对应的堡垒机系统之前,做运维测试工作的人员,需要管理大量的服务器,每天需要对服务器进行必要的巡检、系统更新发布等内容,特别是有很多Windows服务器的时候,如果我们使用Windows自带的“远程桌面连接”只能一台台连接,比较繁琐。并且不能知道那台…

【手撕数据结构】二叉树的性质

目录 叶子节点和边的性质概念小试牛刀 叶子节点和边的性质 概念 可以看到度为0的节点如F没有边&#xff0c;度为1的节点如C有一条边&#xff0c;而度为2的节点如B有两条边。那么设度为2的节点为a个&#xff0c;度为1的节点为b个。二叉树边 2ab另⼀⽅⾯&#xff0c;由于共有 a…

AcWing 897. 最长公共子序列

动态规划就是多见识应用题就完事儿了&#xff0c;也没有什么好说的。 讲解参考&#xff1a; 【E05 线性DP 最长公共子序列】 #include<iostream> #include<algorithm> #define N 1010 using namespace std; char a[N],b[N]; int n,m; int f[N][N]; int main(){…

负载均衡的分类有哪些?

负载均衡主要就是将服务器中的工作任务进行平衡、分摊到多个操作单元上进行运行&#xff0c;以此来协同完成工作任务&#xff0c;那负载均衡会有哪些分类呢&#xff01;接下来就让小编来带领大家一起来了解一下吧&#xff01; 负载均衡可分为软硬件负载均衡和本地、全局负载均衡…

Loki Unable to fetch labels from Loki (no org id)

应该是多租户相关导致的 参考文档: 参考文档cMulti-tenancy | Grafana Loki documentationDescribes how Loki implements multi-tenancy to isolate tenant data and queries.https://grafana.com/docs/loki/latest/operations/multi-tenancy/ https://github.com/grafana…