前端 算法 双指针

文章目录

    • 三数之和
    • 移动零
    • 盛最多水的容器
    • 接雨水

在这里插入图片描述

三数之和

leetcode 三数之和 题目链接

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

注意:答案中不可以包含重复的三元组。

/*** @param {number[]} nums* @return {number[][]}*/
var threeSum = function(nums) {let orderNums = nums.sort((a, b) => a - b);const result = [];
// 三数之和转变为一个固定数去寻找另外两个数for(let i = 0; i<= orderNums.length - 3; i++) {let left = i + 1;let right = orderNums.length - 1;while(left < right) {let count = orderNums[i] + orderNums[left] + orderNums[right];const array = [orderNums[i], orderNums[left], orderNums[right]]if(count > 0) {// 由于orderNums是有序的,通过调整右指针左移 调整变小 寻找下一对right --} else if (count < 0) {//由于orderNums是有序的,通过调整左指针右移 调整变大 寻找下一对left ++} else {
//                  判断是否已经有了对应的数据,不重复const have = result.find((item) => {return item.every((value, index) => value === array[index]);})if(!have) {result.push(array)}// 寻找下一对right--left ++}}}return result};

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

在这里插入图片描述

/*** @param {number[]} nums* @return {void} Do not return anything, modify nums in-place instead.*/
var moveZeroes = function(nums) {for(let i = 0; i < nums.length - 1; i++) {for(let j = i + 1;j < nums.length; j++) {let right = j;if(nums[i] === 0 && nums[j]!== 0) {// 交互位置,确保第i位现在不可能为0[nums[i],nums[j]] = [nums[j],nums[i]]// 然后指针i可以向右移动拉,跳出本次循环break}}}
};

盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。

说明:你不能倾斜容器。

在这里插入图片描述

/*** @param {number[]} height* @return {number}*/
var maxArea = function(height) {let maxArea = 0;let left = 0;let right = height.length - 1;for(let i = 0; i < height.length; i++) {for(let j = i + 1;j < height.length;j++) {let width = j - i;// 高度选最小的let heights = Math.min(height[i], height[j])const area = width * heightsmaxArea = Math.max(maxArea,area)}} return  maxArea
};

上面的写法虽然也是双指针i和j不断移动,但移动的方式不够灵活

/*** @param {number[]} height* @return {number}*/
var maxArea = function(height) {let maxArea = 0;// 两个指针的位置从距离最远开始,不断靠近let left = 0;let right = height.length - 1;while( left < right) {const heights = Math.min(height[left], height[right]);const width = right - left;const area = heights * width;maxArea = Math.max(maxArea,area)// 尽量保留高的值,参与下一轮面积的计算,将值较小的那个指针移动if(height[right] > height[left]) {left++} else {right--}}return  maxArea
};

接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
leetcode 接雨水 https://leetcode.cn/problems/trapping-rain-water/solutions/692342/jie-yu-shui-by-leetcode-solution-tuvc/?envType=study-plan-v2&envId=top-100-liked
在这里插入图片描述

在这里插入图片描述
对于下标 i,下雨后水能到达的最大高度等于下标 i 两边的最大高度的最小值,下标 i 处能接的雨水量等于下标 i 处的水能到达的最大高度减去 height[i]。

我们可以分别用两个for 循环,求出两部分的面积,然后再对两个数组记录的元素进行比较,取较小的值为一个新数组,最后让这个新数组减去柱子本身的高度。

var trap = function(height) {let ans = 0;// 由上图的动态规划可知,两个图加起来,取较低的值为max并减去柱子的高度// 但如果用双指针来实现更容易,一个从左往右,一个从右往左。let left = 0, right = height.length - 1;// 分别记录从左往右的最大值,和从右往左的最大值let leftMax = 0, rightMax = 0;while (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;
};

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

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

相关文章

nuPlan最新SOTA,香港科技大学发布基于学习决策范围内的规划PlanScope

nuPlan最新SOTA&#xff0c;香港科技大学发布基于学习决策范围内的规划PlanScope Abstract 在自动驾驶的背景下&#xff0c;基于学习的方法在规划模块的开发中表现出了很大的潜力。在规划模块的训练过程中&#xff0c;直接最小化专家驾驶日志与规划输出之间的差异是一种广泛采…

MATLAB实现人工免疫网络算法(Artificial Immune Network Algorithm, AINA)

1. 免疫网络算法简介 生物免疫系统是自然界中最复杂、最有效的自适应系统之一&#xff0c;它能够识别并清除入侵的病原体&#xff0c;同时保持对自身细胞的忍耐。免疫网络算法是一种借鉴生物免疫系统原理和机制的计算模型 2.算法流程 3.MATLAB代码 完整代码见: https://down…

MySQL初学之旅(1)配置与基础操作

目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖&#xff0c;今天博主正式开始为大家分享数据库的学习&#xff…

【优选算法】——滑动窗口(下篇)!

目录 1、水果成篮 2、找到字符串中所有字母异位词 3、串联所有单词的子串 4、最小覆盖子串 1、水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能…

【Python】heapq模块(操作最小堆,主要用途优先队列)

Python中heapq模块被称为堆队列算法&#xff0c;也成为优先队列算法。堆的主要用途是优先队列和堆排序。 堆&#xff08;二叉树的应用&#xff09;&#xff1a;最小堆&#xff0c;最大堆。 最小堆&#xff1a;父节点小于等于所有子节点&#xff0c;左右子节点无大小要求&…

MFC图形函数学习06——画椭圆弧线函数

绘制椭圆弧线函数是MFC基本绘图函数&#xff0c;这个函数需要的参数比较多&#xff0c;共四对坐标点。前两对坐标点确定椭圆的位置与大小&#xff0c;后两对坐标确定椭圆弧线的起点与终点。 一、绘制椭圆弧线函数 原型&#xff1a;BOOL Arc(int x1,int y1,int x2,int y2…

Nuxt 项目安装时报错 fetch failed (详细)

报错: ERROR Error: Failed to download template from registry: Failed to download https://raw.githubusercontent.com/nuxt/starter/templates/templates/v3.json: TypeError: fetch failed. 报错原因: 对 raw.githubusercontent.com 进行了 DNS 污染,这会导致你的请…

autox.js下载并保存项目到设备使用

最近刷快手极速版薅羊毛&#xff0c;手动刷有点累。因此找到这个。 PS&#xff1a;更多内容请见官方文档&#xff1a;首页 (autoxjs.com) 1.下载工程化环境&#xff1a;https://github.com/kkevsekk1/AutoX/archive/refs/heads/dev-test.zip 手机软件下载软件&#xff1a;Relea…

ssm+vue680基于SSM的旅游论坛设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

盘点2024年制造业数字化转型的6大发展趋势

​目前制造业的行业数字化发展存在以下几个趋势&#xff1a; 1、从“增量时代”进入“存量时代”&#xff0c;数字化转型成为行业共识 过去几十年&#xff0c;我国装备制造行业从无到有&#xff0c;从小到大&#xff0c;从指数增长的增量时代&#xff0c;进入优化升级的存量时…

安科瑞Acrel-2000ES储能柜能量管理系统的详细介绍-安科瑞 蒋静

Acrel-2000ES储能柜能量管理系统具备全面的储能监控和管理功能。它包括了储能系统设备&#xff08;如PCS、BMS、电表、消防、空调等&#xff09;的详细信息&#xff0c;并实现了数据采集、处理、存储、数据查询与分析、可视化监控、报警管理和统计报表等功能。此外&#xff0c;…

ESP32的下的蓝牙应用笔记(1)——Beacon蓝牙信标

Beacon蓝牙信标简介 ‌Beacon蓝牙信标‌是一种基于蓝牙低功耗&#xff08;BLE&#xff09;技术的设备&#xff0c;主要用于提供位置信息和数据传输服务。它通过周期性地广播信号&#xff0c;能够在一定范围内与其他蓝牙设备进行通信&#xff0c;从而提供精准的位置信息和相关服…

[极客大挑战 2019]BuyFlag1

[极客大挑战 2019]BuyFlag1 审题 菜单有一个home&#xff0c;一个payflag 查看payflag中的要求 具体有三个要求 要有100000000块钱要是CUIT的学生回答正确的密码 知识点 http消息头的伪造 解题 抓包查看信息 看到user0&#xff0c;猜测这应该是CUIT的学生的判断条件…

ElementUI el-form表单多层数组的校验

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; ElementUI el-form表单多层数组的校验 页面效果&#xff1a; 数据结构&#xff1a; addform: {code: ,type: ,value: ,state: 1,remark: ,fieldList: [{fieldCode: ,resolverEntities: [{resolverType: , re…

Java基础-I/O流

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…

FITS论文解析

在本文中&#xff0c;作者探讨了如何将复杂的频域特征提取与简单的线性模型&#xff08;如DLinear&#xff09;结合&#xff0c;以优化时间序列预测任务的效率和解释性。本文的核心思想是利用频域处理和DLinear的简化结构来达到高效的预测能力&#xff0c;同时保留对复杂特征的…

【go从零单排】go三种结构体:for循环、if-else、switch

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 for循环是go语言唯一的循环语句&#xff0c;没错&#xff0c;在go中再也不会看到while true package mainimport …

【数据增强】Mixup

方法来源 Mixup是2018年发表在ICLR上的一种数据增强方法&#xff0c;它通过将多组不同数据集的样本进行线性组合&#xff0c;生成新的样本&#xff0c;从而扩充数据集。 核心思想是从每个batch中随机选择两张图像&#xff0c;并以一定比例混合生成新的图像&#xff0c;新图像的…

基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式

时间序列数据表示了一个随时间记录的值的序列。理解这些序列内部的关系,尤其是在多元或复杂的时间序列数据中,不仅仅局限于随时间绘制数据点(这并不是说这种做法不好)。通过将时间序列数据转换为图,我们可以揭示数据片段内部隐藏的连接、模式和关系,帮助我们发现平稳性和时间连…

Qt学习笔记第41到50讲

第41讲 UI美化遗留问题解决 如上图所示目前记事本的雏形已现&#xff0c;但是还是有待优化&#xff0c;比如右下角的拖动问题。 解决方法&#xff1a; ①首先修改了Widget类的构造函数。 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) {ui->s…