【JavaScript】LeetCode:16-20

news2024/11/10 12:12:15

文章目录

  • 16 无重复字符的最长字串
  • 17 找到字符串中所有字母异位词
  • 18 和为K的子数组
  • 19 滑动窗口最大值
  • 20 最小覆盖字串

16 无重复字符的最长字串

在这里插入图片描述

  • 滑动窗口 + 哈希表
  • 这里用哈希集合Set()实现。
  • 左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    var sset = new Set();
    var res = 0;
    var j = 0;
    for(var i = 0; i < s.length; i++){
        while(!sset.has(s[j]) && j < s.length){
            sset.add(s[j]);
            j++;
        }
        res = Math.max(res, j - i);
        sset.delete(s[i]);
    }
    return res;
};

17 找到字符串中所有字母异位词

在这里插入图片描述

  • 滑动窗口 + 哈希表
  • 创建哈希表p_map,记录字符串p中的字符;创建哈希表s_map,记录当前窗口中的字符。
  • 窗口左端点:left,窗口右端点:right;结果数组res。
  • 移动right指针,直到当前窗口的长度 = t的长度。当某个字符在s_map中的数量 = 该字符在p_map中需要的数量时,need++,即已经有一个字符满足了要求。
  • 当need = p_map.size时,所有字符的数量均满足了要求,此时更新结果:将left放入res中;然后移动left指针,缩小窗口,直到窗口中不包含字符串t中的所有字符,即有一个字符的数量不满足要求,就进入下一轮循环,再次移动right指针。
/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
var findAnagrams = function(s, p) {
    var p_map = new Map();
    var s_map = new Map();
    for(var item of p){
        p_map.set(item, (p_map.get(item) || 0) + 1);
    }
    var plen = p.length;
    var slen = s.length;
    var res = [];
    var left = 0;
    var need = 0;
    for(var right = 0; right < slen; right++){
        var a = s[right];
        if(p_map.get(a)){
            s_map.set(a, (s_map.get(a) || 0) + 1);
            if(s_map.get(a) == p_map.get(a)){
                need++;
            }
        }
        if(right - left == plen - 1){
            if(need == p_map.size){
                res.push(left);
            }
            var b = s[left];
            left++;
            if(p_map.get(b)){
                if(s_map.get(b) == p_map.get(b)){
                    need--;
                }
                s_map.set(b, s_map.get(b) - 1);
            }
        }
    }
    return res;
};

18 和为K的子数组

在这里插入图片描述

  • 前缀和 + 哈希表
  • sums[i]:以nums[i]为结尾的前缀和。sums[j] - sums[i] = k,sums[j] - k = sums[i]。
  • sums[0] = 0,也要将“0:1”放入哈希表。
  • 遍历前缀和数组,先查找在哈希表中sums[item] - k的个数,然后再将当前元素放入哈希表中,注意:二者顺序不可调换,否则在k = 0时就会出错,例如[3],k = 0,若先放入“3:1”,则3 - k = 3 - 0 = 3,此时3的个数为1,结果记录就会 + 1,但其实是错误的。
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function(nums, k) {
    var sums = new Array(nums.length + 1).fill(0);
    for(var i = 0; i < nums.length; i++){
        sums[i + 1] = sums[i] + nums[i];
    }
    var map = new Map();
    var res = 0;
    for(var item of sums){
        res += map.get(item - k) || 0;
        map.set(item, (map.get(item) || 0) + 1);
    }
    return res;
};

19 滑动窗口最大值

在这里插入图片描述

  • 单调队列
  • 维护一个从出口到入口单调递减的队列,即出口处是最大值。这里的队列q记录索引值。
  • push()、pop():如果push的元素value大于队列中最后一个元素的数值,那么就将队列最后一个元素弹出,直到push元素的数值小于等于队列最后一个元素的数值为止。
  • 从i = k - 1开始记录,max = q[0]所对应的数值。
  • i与q[0]所指向的索引相差k时,弹出q[0]。
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    var q = [];
    var res = [];
    for(var i = 0; i < nums.length; i++){
        while(q.length != 0 && nums[i] >= nums[q[q.length - 1]]){
            q.pop();
        }
        q.push(i);
        if(i - q[0] == k){
            q.shift();
        }
        if(i >= k - 1){
            res.push(nums[q[0]]);
        }
    }
    return res;
};

20 最小覆盖字串

在这里插入图片描述

  • 滑动窗口 + 哈希表
  • 创建哈希表t_map,记录字符串t中的字符;创建哈希表s_map,记录当前窗口中的字符。
  • 窗口左端点:left,窗口右端点:right;当满足条件时的字符串左端点:start,字符串长度:res。
  • 移动right指针,直到当前窗口中包含字符串t中的所有字符。当某个字符在s_map中的数量 = 该字符在t_map中需要的数量时,need++,即已经有一个字符满足了要求。
  • 当need = t_map.size时,所有字符的数量均满足了要求,此时更新结果:左端点start和字符串长度res;然后移动left指针,缩小窗口,直到窗口中不包含字符串t中的所有字符,即有一个字符的数量不满足要求,就进入下一轮循环,再次移动right指针。
/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
    if(s.length < t.length){
        return "";
    }
    var s_map = new Map();
    var t_map = new Map();
    for(var item of t){
        t_map.set(item, (t_map.get(item) || 0) + 1);
    }
    var need = 0;
    var left = 0;
    var start = 0;
    var res = Number.MAX_VALUE;
    for(var right = 0; right < s.length; right++){
        var a = s[right];
        if(t_map.has(a)){
            s_map.set(a, (s_map.get(a) || 0) + 1);
            if(s_map.get(a) == t_map.get(a)){
                need++;
            }
        }
        while(need == t_map.size){
            var b = s[left];
            if(right - left + 1 < res){
                start = left;
                res = right - left + 1;
            }
            left++;
            if(t_map.has(b)){
                if(s_map.get(b) == t_map.get(b)){
                    need--;
                }
                s_map.set(b, s_map.get(b) - 1);
            }
        }
    }
    return (res == Number.MAX_VALUE)? "": s.slice(start, start + res);
};

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

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

相关文章

jmeter性能测试HTML测试报告生成详解

作用&#xff1a;jmeter支持生成HTML测试报告&#xff0c;方便查看测试计划中获得图表和统计信息 命令&#xff1a; jmeter -n -t [jmx file] -l [result file] -e -o [html report folder] 示例&#xff1a;jmeter -n -t login.jmx -l result.jtl -e -o ./report jmx文件&a…

玛雅Maya2024下载安装教程影视三维3D设计教程百度网盘分享链接地址

玛雅Maya下载安装教程影视三维3D设计教程百度网盘分享链接地址,玛雅是一款3d设计软件。Maya 是由 Autodesk 公司开发的专业三维计算机图形软件。主要应用于影视特效制作、游戏开发、广告设计和工业设计等领域。在影视特效中&#xff0c;可创建逼真特效场景和角色动画&#xff1…

【Day09-IO-字符流其它流】

IO流 IO流-字符流 字节流&#xff1a;适合复制文件等&#xff0c;不适合读写文本文件 字符流&#xff1a;适合读写文本文件内容 FileReader&#xff08;文件字符输入流&#xff09; 作用&#xff1a;以内存为基准&#xff0c;可以把文件中的数据以字符的形式读入到内存中来。 …

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示&#xff1a;这篇博客以我前两篇博客作为先修知识&#xff0c;请大家先去看看我前两篇博客 博客指路&#xff1a;前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作…

高并发内存池(二):​整体框架的介绍与ThreadCache的实现

目录 整体框架介绍 ThreadCache的主体框架 自由链表-FreeList 内存对齐-RoundUp 计算桶位置-Index 基础版 进阶版 线程局部存储 __declspec(thread) 关键字 实现线程无锁 申请内存-Allocate 释放内存-Deallocate 从中心缓存中申请内存 整体框架介绍 高并发内存池…

变量数据类型 Day3

1. 变量 1.1 变量的概念 变量是计算机内存中的一块存储单元&#xff0c;是存储数据的基本单元变量的组成包括&#xff1a;数据类型、变量名、值&#xff0c;后文会具体描述变量的本质作用就是去记录数据的&#xff0c;比如说记录一个人的身高、体重、年龄&#xff0c;就需要去…

【微处理器系统原理和应用设计第十讲】外部中断之开发键控灯亮灭功能

一、基础知识 外部设备所产生的信号通过EXIT触发中断。 1、与中断相关的主要寄存器 EXTI共设有6个寄存器&#xff0c;分别为中断屏蔽寄存器&#xff08;IMR&#xff09;&#xff0c;事件屏蔽寄存器&#xff08;EMR&#xff09;&#xff0c;上升沿触发选择寄存器&#xff08;…

Ubuntu | 安装 Truffle 框架(安装缓慢)

目录 预备工作具体步骤Step1&#xff1a;安装 nvma. 官方方式&#xff08;可能失败&#xff09;b. 压缩包安装方式 Step2&#xff1a;安装 node.js 和 npmStep3&#xff1a;安装 Truffle 参考博客 前言&#xff1a;昨天安装 Truffle 框架&#xff0c;结果缓冲条转了一晚上都没安…

利士策分享,如何平衡物质追求与心理健康?

利士策分享&#xff0c;如何平衡物质追求与心理健康? 在快节奏的现代社会&#xff0c;物质追求与心理健康仿佛成了人们生活中不可或缺的两极。 一方面&#xff0c;科技的飞速发展和经济的繁荣让我们拥有了前所未有的物质享受&#xff1b; 另一方面&#xff0c;高压的工作环…

前端基础 | HTML基础:HTML结构,HTML常见标签

文章目录 HTML1、HTML结构1.1HTML标签1.1.1标签1.1.2标签含义 1.2HTML文件基本结构1.3标签层次结构1.4 快速生成代码框架 2、HTML常见标签2.1注释标签2.2标题标签&#xff1a;h1–h62.3段落标签&#xff1a;p2.4 换行标签&#xff1a;br2.5格式化标签2.6 图片标签&#xff1a;i…

细致刨析JDBC ② 进阶篇

目录 一、JDBC拓展 1.实体类和ORM Ⅰ、ORM思想封装单个对象 Ⅱ、ORM思想封装集合 2.主键回显 3.批量操作 ① 循环逐条数据进行添加 ② 批量进行添加 二、连接池 1.现有问题 2.连接池 3.常见连接池 4.Druid连接池使用 使用步骤&#xff1a; 硬编码 软编码 5.HikariCP连接池使用 …

(详细文档)javaswing学生成绩管理系统(mysql)+详细报告

摘要 在现今信息时代&#xff0c;生活速度的加快&#xff0c;使得人们越来越向信息化、数字化发展。 随着学校的规模不断扩大&#xff0c;学生数量急剧增加&#xff0c;有关学生的各种信息量也成倍增 长&#xff0c;尤其是学生的考试成绩数据。面对庞大的学生的成绩&#xff0…

@Value读取properties中文乱码解决方案

前几天碰到使用Value中文乱码的问题&#xff0c;英文字符则不会出现问题 原因&#xff1a;SpringBoot在加载properties配置文件时&#xff0c;使用的默认编码是&#xff1a;ISO_88599_1 解决方式&#xff1a;将properties改成yml就可以读取成功了 Data Component PropertySou…

数据结构(邓俊辉)学习笔记】排序 1——快速排序:算法A

文章目录 1. 分而治之2. 轴点3. 构造轴点4. 单调性 不变性5. 实例 1. 分而治之 主题就是排序。实际上我们对于排序问题并不陌生。你应该记得在最开始的几章&#xff0c;我们就分别介绍过起泡排序、插入排序、选择排序以及归并排序&#xff0c;而在介绍散列技术时&#xff0c;我…

Tableau 2023下载安装教程最新教学附软件包百度网盘分享链接地址

Tableau 2023介绍 Tableau 2023下载安装教程最新教学附软件包百度网盘分享链接地址&#xff0c;Tableau 是一款强大的数据可视化软件。它能连接多种数据源并整合&#xff0c;操作简单&#xff0c;通过拖放即可创建可视化报表和仪表盘。具有高效的分析处理能力&#xff0c;支持…

windows下安装并使用nvm

目录 一.准备工作&#xff1a;卸载node 卸载步骤 二.下载nvm 三.安装nvm 三.配置下载源【重要】 四.使用nvm安装node.js 五.nvm常用命令 六.卸载nvm 一.准备工作&#xff1a;卸载node 如果电脑上已经有node&#xff0c;那么我们需要先完全卸载node&#xff0c;再安装…

LeetCode 热题 100 回顾15

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

FastAPI模块化:为复杂应用程序提供清晰的结构

开题描述&#xff1a; 在现代软件开发中&#xff0c;随着应用程序规模的扩大和功能的增加&#xff0c;传统的单体架构逐渐暴露出其局限性。FastAPI&#xff0c;作为一款高性能的现代Web框架&#xff0c;通过其模块化设计提供了一种解决方案。本文将探讨FastAPI模块化如何为构建…

顶刊中的树状图如何绘制?|科研绘图·24-09-07

小罗碎碎念 本期推文主题&#xff1a;树状图 本期推文主要介绍如何绘制树状图以及它的一些变体形式&#xff0c;看完本篇推文&#xff0c;你最终能够实现的效果如下。 一、组织结构图 Dendrogram是一种网络结构&#xff0c;由一个根节点开始&#xff0c;该节点通过边或分支连接…

找商业网字体加密(TTFont方法)

网点地址&#xff1a;公司介绍-泰州名列新材料有限公司 (zhaosw.com) 问题如下&#xff1a; 在网站中看到的电话号码在页面源码中无法查看 破解步骤&#xff1a; 1.找到woff文件 查找字体的class属性&#xff0c;全文查找font-face-encrypted找到如下内容&#xff0c;可以看到…