二十天刷leetcode【hot100】算法- day2[前端Typescript]

news2024/12/29 9:19:39

指针

6.三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。
在这里插入图片描述
leetcode 15. 三数之和

题解

该题需要先从小到大排序,后需要建立三个指针,从头到尾完成遍历,第一层遍历决定第一个元素(first),第二层遍历决定第二个元素(second = first + 1)跟第三个元素(third,初始化为最大的元素)。其中对于确认了first后,就要对secondthird进行首尾遍历。原则为:三者相加,大于target则左移third,小于则右移second。另外需要注意,不能输出相同的元素,又因为该数组一开始就经过排序,则可以跳过相等的两个元素。

function threeSum(nums: Array<number>): Array<Array<number>> {
    const res: Array<Array<number>> = [];
    // 先进行排列
    nums.sort((a, b) => a - b);
    for(let first = 0; first < nums.length; first ++) {
        // 第一层遍历
        if (first > 0 && nums[first] === nums[first - 1]) {
            // 相邻的两个元素相等,则跳过
            continue;
        }
    
        // 第三个元素初始化为排列后的最后一个,即数组最大值
        let third = nums.length - 1;
        // tagget + nums[first] = 0
        const target = -1 * nums[first];
        
        // 第二个元素初始化为第一个元素的后一个元素
        for(let second = first + 1; second < nums.length - 1; second ++) {
            // 对数组进行《首尾收缩遍历》
            if (second > first + 1 && nums[second] === nums[second - 1]) {
                // 相邻的两个元素相等,则跳过
                continue;
            }
            
            while(second < third && nums[second] + nums[third] > target) {
                // 第二第三元素相加大于target,则向头部收缩
                third--;
            }
            
            if (second === third) {
                // 相等了,则直接跳去循环
                // 因为元素不能相等,则该数组经过排序,若相等,后面的《首尾收缩遍历》都会相等
                break
            } else if (nums[second] + nums[third] === target) {
                res.push([nums[first], nums[second], nums[third]]);
            }
        }
    }
    return res;
};
    
// const arr = threeSum([-1, 0, 1, 2, -1, -4]);
// // { arr: [ [ -1, -1, 2 ], [ -1, 0, 1 ] ] }
// console.log({ arr });

7.最接近的两数和 - 字节-上海

给出一个数组和一个目标值,找出两个和最接近目标值的子项

题解

数组从大到小排序,双指针首尾收缩遍历,当前两者相加大于目标则收缩尾部,小于则收缩头部,用res记录最接近目标值的值

function testNear (arrNear: Array<number>, targetNear: number): number {
    // 排序
    arrNear.sort((a, b) => a - b);
    let left = 0, right = arrNear.length - 1;
    let res: number = 0;
    while(left < right) {
        // 这里的结束边界不能是left <= right
        // 因为arrNear[left]和arrNear[right]需要是不同的元素
        // 《首尾收缩遍历》
        const temp = arrNear[left] + arrNear[right];
        if(temp === targetNear) {
            return res;
        } else if (temp > targetNear) {
            // 尾部收缩
            right--;
        } else {
            // 头部收缩
            left++;
        }
        // 更新最接近的值
        res = Math.abs(targetNear - res) > Math.abs(targetNear - temp) ? temp : res;
    }

    return res;
}

// const arrNear = [24,69,14,37];
// const targetNear = 60;
// const nearP = testNear(arrNear, targetNear);
// console.log({ nearP }); // { nearP: 61 }

8 接雨水 - 腾讯cdg

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述
leetcode 42. 接雨水

题解
一:动态规划

dp数组记录下标i及其左(leftMax )右(rightMax)边的所有柱子的最大高度。dp数组初始化,leftMax[0] = height[0];rightMax[len - 1] = height[len - 1];。dp数组遍历过程中,左右侧的值与当值的高度进行对比,更新dp数组

leftMax[i] = Math.max(leftMax[i - 1], height[i]);
rightMax[j] = Math.max(rightMax[j + 1], height[j]);

左右侧最高的两条柱子中,矮的那条减自身高度,即为当前柱子能接的水

function trapDp(height: Array<number>): number {
    // 动态规划
    const len = height.length;
    if (len === 0) {
        return 0;
    }
    // 下标i及其左边的所有柱子的最大高度
    const leftMax = Array(len).fill(0);
    // 下标i及其右边的所有柱子的最大高度
    const rightMax = Array(len).fill(0);

    // 初始化
    leftMax[0] = height[0];
    rightMax[len - 1] = height[len - 1];

    for(let i = 1; i < len; i++) {
        // 更新柱子i 左侧(包括自身)的最高高度
        leftMax[i] = Math.max(leftMax[i - 1], height[i]);
    }

    for(let j = len - 2; j >= 0; j--) {
        // 更新柱子i 右侧(包括自身)的最高高度
        rightMax[j] = Math.max(rightMax[j + 1], height[j]);
    }

    let ans = 0;

    for (let k = 0; k < len; k++) {
        // 左右侧最高的两条柱子中,矮的那条减自身高度,即为当前柱子能接的水
        ans += Math.min(leftMax[k], rightMax[k]) - height[k];
    }

    return ans;
};

// const e = trapDp([0,1,0,2,1,0,1,3,2,1,2,1]);
// console.log({ e }); // 6
二、双指针

头尾双指针收缩遍历,详细见代码解

function trap(height: Array<number>): number {
    // 双指针
    const len = height.length;

    let left = 0, right = height.length - 1;
    // 初始化左右最大值
    let leftMax = height[0], rightMax = height[len - 1];

    let ans = 0;
    while(left < right) {
        // 这里循环不是为了找到某条柱子,而是要经过所有的柱子即可
        // 所有不用left <= right
        // 左侧最大值与左指针相比,更新最大值
        leftMax = Math.max(leftMax, height[left]);
        // 右侧最大值与左指针相比,更新最大值
        rightMax = Math.max(rightMax, height[right]);

        // 移动较矮的指针(因为矮的指针决定能存多少水--木桶原理),累加可以积累的雨水
        if (height[left] < height[right]) {
            ans += leftMax - height[left];
            // 左指针比较小,移动左指针
            left++;
        } else {
            ans += rightMax - height[right];
            right--;
        }
    }
    return ans;
};

// const f = trap([0,1,0,2,1,0,1,3,2,1,2,1]);
// console.log({ f }); // { f: 6 }

9 无重复字符串的最长子串

给定一个字符串s ,请你找出其中不含有重复字符的 最长
子串的长度。
在这里插入图片描述
leetcode 3.无重复字符串的最长子串

题解

双指针搭配set, 用set去重,左指针移动, set移除元素,右指针移动,且右指针元素不存在于set中,则加入set,最后根据左右指针位置更新最大长度

function lengthOfLongestSubstring(s: string): number {
    // 左右指针
    // 用set去重
    const setNew = new Set();
    let right = -1;

    let ans = 0;

    for(let left = 0; left < s.length; left++) {
    if (left > 0) {
        // 左指针移动, set移除左指针
        setNew.delete(s[left - 1]);
    }

    // 右指针移动
    while(right + 1 < s.length && !setNew.has(s[right + 1])) {
    // 右指针不超过边界,且右指针元素不存在于set中,则加入set
    setNew.add(s[right + 1]);
    right++;
    }

    // 根据左右指针位置更新最大长度
    ans = Math.max(ans, right - left + 1);
    }

    return ans;
};

// const g = lengthOfLongestSubstring('abcabcbb');
// // { g: 3 }
// console.log({ g });

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

给定两个字符串 sp,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
在这里插入图片描述
leetcode 438.找到字符串中所有字母异位词

题解

使用《位置数组》记录当前值在英文字母中的顺序。初始化遍历先把p字符串和s下标0pLen - 1的子串遍历完。如这个时候如果位置数组相等,则把下标0推进数组。后将s剩下的数据遍历完成。

function findAnagrams(s: string, p: string): Array<number> {
    const sLen = s.length, pLen = p.length;

    if (sLen < pLen) {
        // s长度小于p长度,s中不存在p的异位词子串
        return [];
    }

    const ans: Array<number> = [];
    // 初始化位置数组
    const sCount = new Array(26).fill(0);
    const pCount = new Array(26).fill(0);
    for (let i = 0; i < pLen; ++i) {
        // 初始化遍历
        // 用《位置数组》记录当前值在英文字母中的顺序
        // 先把p字符串和s下标0到pLen - 1的子串遍历完
        ++sCount[s[i].charCodeAt(0) - 'a'.charCodeAt(0)];
        ++pCount[p[i].charCodeAt(0) - 'a'.charCodeAt(0)];
    }

    if (sCount.toString() === pCount.toString()) {
        // 把p字符串和s下标0到pLen - 1的子串遍历完了,如这个时候如果位置数组相等,则把下标0推进数组
        ans.push(0);
    }

    for (let i = 0; i < sLen - pLen; ++i) {
        // 将s剩下的数据遍历完成
        // 将左侧的移除
        --sCount[s[i].charCodeAt(0) - 'a'.charCodeAt(0)];
        // 加入右侧新遍历的(中间差了初始化遍历的pLen个值)
        ++sCount[s[i + pLen].charCodeAt(0) - 'a'.charCodeAt(0)];

        if (sCount.toString() === pCount.toString()) {
            // 位置数组相等,则把下标推进数组
            ans.push(i + 1);
        }
    }

    return ans;
};

// const arr = findAnagrams('cbaebabacd', 'abc');
// // { arr: [ 0, 6 ] }
// console.log({ arr });

关注我的公众号,回复 100905A1 获取hot100算法在线链接
在这里插入图片描述

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

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

相关文章

Maven项目中Allure和AspectJ的配置及测试执行(常见报错解决方法)

Maven项目中Allure和AspectJ的配置及测试执行 在自动化测试领域&#xff0c;Allure和AspectJ是两个非常有用的工具。Allure提供了丰富的测试报告&#xff0c;而AspectJ则允许我们以声明式的方式编写横切关注点&#xff0c;如日志记录、事务管理等。本文将指导您如何在Maven项目…

MySQL基础练习题47-判断三角形

目录 题目 准备数据 分析数据 方法一 &#xff1a;if函数 方法二&#xff1a;case when 题目 对每三个线段报告它们是否可以形成一个三角形。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Triangle (x int, y int, z int)## …

XSS-过滤特殊符号的正则绕过

靶场网址&#xff1a;https://xss.pwnfunction.com/ 题目源码&#xff1a; mafia (new URL(location).searchParams.get(mafia) || 11)mafia mafia.slice(0, 50)mafia mafia.replace(/[\\\"\\-\!\\\[\]]/gi, _)mafia mafia.replace(/alert/g, _)eval(mafia) 分析代码…

autojsUI界面分享 免责条款界面

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;九黎aj &#x1f3c3;&#x1f3fb;‍♂️幸福源自奋斗,平凡造就不凡 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f331;欢迎订阅我的…

计算机毕业设计选题推荐-springboot 基于SpringBoot的宠物爱心组织管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

网络编程,网络协议,UDP协议

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …

python中模块,包,python常用内置模块,第三方模块

python模块 模块的导入&#xff1a; 模块可以导入一整个也可以导入其中的部分变量函数类&#xff0c;直接饶了的变脸函数类在使用时候就可以不用再前边写上 模块的名字. 这个部分了&#xff0c;所有需要注意同名函数会覆盖&#xff0c;使用时会调用后引入模块的这个函数 包 …

第18 章探讨 C++新标准.新的类功能.比较函数指针、函数符和 Lambda 函数

第18 章探讨 C新标准.新的类功能.比较函数指针、函数符和 Lambda 函数 第18 章探讨 C新标准.新的类功能.比较函数指针、函数符和 Lambda 函数 文章目录 第18 章探讨 C新标准.新的类功能.比较函数指针、函数符和 Lambda 函数18.4 Lambda 函数18.4.1 比较函数指针、函数符和 Lam…

Python爬虫入门教程(非常详细)适合零基础小白

一、什么是爬虫&#xff1f; 1.简单介绍爬虫 爬虫的全称为网络爬虫&#xff0c;简称爬虫&#xff0c;别名有网络机器人&#xff0c;网络蜘蛛等等。 网络爬虫是一种自动获取网页内容的程序&#xff0c;为搜索引擎提供了重要的数据支撑。搜索引擎通过网络爬虫技术&#xff0c;将…

为什么穷大方

为什么有些人明明很穷&#xff0c;却非常的大方呢&#xff1f; 因为他们认知太低&#xff0c;根本不懂钱的重要性&#xff0c;总是想着及时享乐&#xff0c;所以一年到头也存不了什么钱。等到家人孩子需要用钱的时候&#xff0c;什么也拿不出来&#xff0c;还到处去求人。 而真…

电子电气架构 --- 车载以太网

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

DOM破坏及其实战案例

目录 DOM靶场&#xff1a; 第六关&#xff1a; 第七关&#xff1a; 第八关&#xff1a; DOM破坏&#xff1a; dom破坏案例1&#xff1a; 案例二&#xff1a; DOM靶场&#xff1a; DOM靶场平台&#xff1a;Challenges 前五关请查看&#xff1a;DOM型xss靶场实验_domx…

如何使用天地图

第一步&#xff1a;登录/注册 国家地理信息公共服务平台 第二步&#xff1a;获取服务许可&#xff08;Key&#xff09; 如果你已经申请了许可&#xff0c;那可以不用看上的了&#xff0c;如何使用请看下面 1.首先在index.html中一下代码 <script src"http://api.tian…

creo曲面建模1

偏移平面&#xff1a; 在偏移面做一个圆&#xff1a; 在阿基米德曲线上&#xff0c;将曲线四等分。点在曲线上并且在相交基准面上&#xff1a; 绘制曲线&#xff1a; 第二段&#xff1a; 第三段&#xff1a; 第四段4.5高&#xff1a; 曲线复合&#xff1a; 边界混合&a…

2024下半年软考备考全攻略:科目选择与高效学习策略

随着2024年下半年的脚步日益临近&#xff0c;软考&#xff08;软件水平考试&#xff09;的考生们也开始紧锣密鼓地准备起来。今年&#xff0c;软考官方对考试科目进行了重大调整&#xff0c;为考生们提供了更加多样化的选择。以下是详细的考试信息、科目调整以及针对不同考生群…

铁电存储器(FM24W256)I2C读写驱动(1):FM24W256简介

0 参考资料 FM24W256&#xff08;Cypress公司生产&#xff09;数据手册 1 FM24W256铁电存储器简介 铁电存储器&#xff08;FRAM&#xff09;相比带电可擦可编程只读存储器&#xff08;EEPROM&#xff09;最突出的两个优势就是 拥有几乎无限的读写次数和写入不需要等待&#xf…

打卡学习Python爬虫第二天|Requests的使用

一、什么是requests库&#xff1f; requests库是一个非常流行和强大的HTTP库&#xff0c;它用于在Python中发送HTTP请求。这个库的主要特点是其简洁和易于使用的API&#xff0c;使得发送网络请求和获取响应变得非常简单。 以下是requests库的一些关键特点和使用方法&#xff…

四年的功能测试,在这个金九银十的招聘旺季找不到工作怎么办?

昨天周日跟一个读者聊了很久&#xff0c;今天跟大家聊一下他的故事。 他做了4年的功能测试了&#xff0c;最近因为种种原因换工作&#xff0c;结果从8月底到现在快两个月了&#xff0c;面试了十几二十家&#xff0c;收到的offer都不是自己很满意的&#xff0c;很是懊恼&#x…

C语言相关

1. 代码执行过程 1.1 简述编译运行一段代码的过程 1.1.1 预处理 为了接下来能够解释的更加清楚&#xff0c;使用linux 平台下的 gcc 编译器解释。先书写一个非常简单的程序来介绍&#xff1a; 第一步发生的是预编译&#xff0c;使用-E 指令会使程序只进行到预编译指令。经过…

html+css+js 黑神话悟空网页设计与制作

htmlcssjs 黑神话悟空网页设计与制作 网站介绍 1、网站程序&#xff1a;主要使用网页三剑客htmlcssjavaScript实现网页设计与制作&#xff0c;完成网站的功能设计。制作适用于任何浏览器或设备的精美网站。 2、网站素材&#xff1a;搜集或制作适合网页风格和尺寸的图片&#…