【JavaScript 算法】双指针法:高效处理数组问题

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、算法原理
    • 二、算法实现
      • 示例问题1:两数之和 II - 输入有序数组
      • 示例问题2:反转字符串中的元音字母
      • 注释说明:
    • 三、应用场景
    • 四、总结

在这里插入图片描述

双指针法(Two Pointer Technique)是一种高效解决数组和字符串问题的算法技巧,通过维护两个指针来遍历数组,从而在特定条件下高效地解决问题。双指针法通常用于有序数组或字符串,常见的应用场景包括寻找和为特定值的两数、移除元素、合并两个有序数组等。本文将详细介绍双指针法的原理、实现及其应用。


一、算法原理

双指针法通过同时维护两个指针来遍历数组,从而在特定条件下高效地解决问题。双指针法的基本思想是:

  1. 初始化两个指针,通常分别指向数组的起始位置和结束位置,或者都指向起始位置。
  2. 根据特定的条件移动指针,直到满足问题的要求。

二、算法实现

示例问题1:两数之和 II - 输入有序数组

DFS and BFS

给定一个已按升序排列的数组,找到两个数使得它们的和等于目标数。

/*** 在有序数组中找到两个数使得它们的和等于目标数* @param {number[]} numbers - 输入的有序数组* @param {number} target - 目标和* @return {number[]} - 两个数的索引(从1开始计数)*/
function twoSum(numbers, target) {let left = 0;let right = numbers.length - 1;while (left < right) {const sum = numbers[left] + numbers[right];if (sum === target) {return [left + 1, right + 1]; // 返回结果,索引从1开始计数} else if (sum < target) {left++; // 移动左指针} else {right--; // 移动右指针}}return []; // 如果没有找到符合条件的数,返回空数组
}// 示例
const numbers = [2, 7, 11, 15];
const target = 9;
console.log(twoSum(numbers, target)); // 输出: [1, 2]

示例问题2:反转字符串中的元音字母

DFS and BFS

编写一个函数,以字符数组为输入,反转该字符串中的元音字母。

/*** 反转字符串中的元音字母* @param {string} s - 输入字符串* @return {string} - 反转元音字母后的字符串*/
function reverseVowels(s) {const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);const arr = s.split('');let left = 0;let right = arr.length - 1;while (left < right) {while (left < right && !vowels.has(arr[left])) {left++;}while (left < right && !vowels.has(arr[right])) {right--;}if (left < right) {[arr[left], arr[right]] = [arr[right], arr[left]];left++;right--;}}return arr.join('');
}// 示例
const s = "hello";
console.log(reverseVowels(s)); // 输出: "holle"

注释说明:

  1. 两数之和 II - 输入有序数组

    • let left = 0; let right = numbers.length - 1;:初始化两个指针,分别指向数组的起始位置和结束位置。
    • while (left < right):遍历数组,直到两个指针相遇。
    • const sum = numbers[left] + numbers[right];:计算两个指针指向的数的和。
    • if (sum === target):如果和等于目标数,返回两个数的索引。
    • else if (sum < target):如果和小于目标数,移动左指针。
    • else:如果和大于目标数,移动右指针。
  2. 反转字符串中的元音字母

    • const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);:定义元音字母集合。
    • const arr = s.split('');:将字符串转换为字符数组。
    • let left = 0; let right = arr.length - 1;:初始化两个指针,分别指向数组的起始位置和结束位置。
    • while (left < right && !vowels.has(arr[left])) left++;:移动左指针,直到指向元音字母。
    • while (left < right && !vowels.has(arr[right])) right--;:移动右指针,直到指向元音字母。
    • if (left < right) [arr[left], arr[right]] = [arr[right], arr[left]]; left++; right--;:交换两个元音字母,并移动指针。

三、应用场景

  1. 数组问题:如两数之和、三数之和、移除元素、合并两个有序数组等。
  2. 字符串问题:如反转字符串中的元音字母、最长回文子串等。
  3. 链表问题:如合并两个有序链表、删除链表中的节点等。

四、总结

双指针法是一种高效解决数组和字符串问题的算法技巧,通过同时维护两个指针来遍历数组,可以在特定条件下高效地解决问题。理解和掌握双指针法,可以有效解决许多实际问题,如两数之和、反转字符串中的元音字母等。


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

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

相关文章

深入理解Java并发线程阻塞唤醒类LockSupport

LockSupprot 用来阻塞和唤醒线程&#xff0c;底层实现依赖于Unsafe类 该类包含一组用于阻塞和唤醒线程的静态方法&#xff0c;这些方法主要是围绕 park 和 unpark 展开 public class LockSupportDemo1 {public static void main(String[] args) {Thread mainThread Thread.cu…

微信小程序(百战商城)的实战项目的首页的制作及讲解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【人工智能】基于香橙派AIpro和昇腾AI计算芯片的面部口罩检测(详细教程)

目录 前言 1.介绍开发板 2.应用场景 3.安装操作系统 3.1 下载工具 3.2 烧录系统 3.3 系统装载 4.配置操作系统 4.1 登录系统账户 4.2 配置网络连接 4.3 查看设备网络 4.4 配置远程连接 5.部署目标检测应用 5.1 准备运行环境 5.2 模型二次训练 ​5.3 热成像温度…

数据结构 day4

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

pikachu之暴力破解

1基于表单的暴力破解 随便输入然后抓包 选中添加账号密码 添加分别添加payload1&#xff0c;2&#xff0c;的字典 开始攻击 2验证码绕过on server 和基于表单的暴力破解相比&#xff0c;多了一个验证码功能 这个验证码是前端的验证码&#xff08;和前面那个一样选中添加账号密码…

Java小技能:多级组织机构排序并返回树结构(包含每个层级的子节点和业务数据集合)

文章目录 引言I 实体定义1.1 部门1.2 用户组织机构中间表1.3 树状DTOII 抽取组织机构排序方法2.1 树状排序方法2.2 案例III 查询条件构建3.1 根据部门进行权限控制3.2 注入风险引言 需求: 根据组织机构进行数据授权控制,例如控制船舶、船舶设备、摄像头、港区查看权限。 一…

kettle从入门到精通 第七十六课 ETL之kettle kettle连接hive教程

1、群里有小伙伴询问kettle连接hive的demo&#xff0c;今天抽点时间整理下。其实kettle连接hive和连接mysql数据库也是一样的。 1&#xff09;kettle中的lib目录下放hive驱动jar&#xff0c;这里我使用的是kyuubi-hive-jdbc-shaded-1.9.0.jar。 2&#xff09;设置hive连接参数…

pytorch学习(九)激活函数

1.pytorch常用激活函数如下&#xff1a; #ReLU激活函数 #Leaky ReLU激活函数 #Sigmoid激活函数 #Tanh激活函数 #Softmax激活函数 #Softplus2.代码 import torch.nn as nn import torch import numpy from torch.utils.tensorboard import SummaryWriterwriter SummaryWriter…

ModuleNotFoundError: No module named ‘lime‘,lime。 安装 LIME库

LIME LIME 的作用安装 LIME示例代码详细解释 总结 LIME&#xff08;Local Interpretable Model-agnostic Explanations&#xff0c;局部可解释不可知模型&#xff09;是一个Python库&#xff0c;用于解释机器学习模型的预测结果。它通过构建一个简单的、本地的可解释模型来近似…

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…

Unity UGUI 之EventSystem

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.EventSystem是什么&#xff1f; 有需要请查看手册&#xff1a;Unity - 手册&#xff1…

2024.7.19最新详细的VMware17.0.0安装

VM官网VMware - Delivering a Digital Foundation For Businesses。现在官网无法下载&#xff0c;点击会跳转到https://access.broadcom.com/default/ui/v1/signin/ 要注册一个账号&#xff1a; 注册登录以后&#xff0c;点击Please select your identity provider. - Support …

昇思25天学习打卡营第2天 | 快速入门

在快速发展的人工智能领域&#xff0c;深度学习已经成为数据分析和模式识别的核心技术。作为一名深度学习初学者&#xff0c;我有幸通过MindSpore平台进行了实战演练&#xff0c;从数据预处理到模型训练与测试&#xff0c;再到模型保存与加载&#xff0c;经历了一次完整的深度学…

基于SpringBoot+Vue的校园台球厅设备管理系统(带1w+文档)

基于SpringBootVue的校园台球厅设备管理系统(带1w文档) 基于SpringBootVue的校园台球厅设备管理系统(带1w文档) 本次设计任务是要设计一个校园台球厅人员与设备管理系统&#xff0c;这个系统能够满足校园台球厅人员与设备的管理及用户的校园台球厅人员与设备管理功能。系统的主…

彻底卸载360安全卫士的方法

法一&#xff1a; 按下WindowsR键&#xff0c;并输入msconfig, 在“引导”选项卡中选择“安全引导”&#xff0c;并重新启动进入安全模式。此时&#xff0c;重复第一种方法“应用和功能”-“360安全卫士”-“卸载”&#xff0c;在弹出的对话框中残忍的拒绝它的各种令人发指的无…

go-微服务的设计概括

一、微服务到底是什么&#xff1f; 初学者很容易把微服务和分布式混为一谈&#xff0c;但其实二者之间存在非常大的差异&#xff0c;我个人认为主要有以下几点&#xff1a; 分布式主要是一种技术手段&#xff0c;用来保证多个相同的进程能够共同工作而不出错。采用各种复杂的…

基于Ubuntu2310搭建openstack高可用集群B版

openstack-ha 环境初始化安装haproxy安装keepalived数据库集群高可用rabbitmq集群高可用memcache集群配置 keystone高可用glance高可用placement高可用nova高可用neutron高可用horizon高可用 本实验使用两台节点master和node配置haproxy高可用&#xff0c;keepliaved配置主备抢…

IntelliJ IDEA 直接在软件中更新为最新版

当我们的 IDEA 工具许久没有更新&#xff0c;已经拖了好几个版本&#xff0c;想跨大版本更新&#xff0c;比如从2020.2.1 -> 2023.x.x 此时&#xff0c;我们菜单栏点击 Help -> Check for Updates… &#xff0c;右下角会有提示更新&#xff0c;如下图&#xff1a; 点…

go 实现websocket以及详细设计流程过程,确保通俗易懂

websocket简介&#xff1a; WebSocket 是一种网络传输协议&#xff0c;可在单个 TCP 连接上进行全双工通信&#xff0c;位于 OSI 模型的应用层。WebSocket 协议在 2011 年由 IETF 标准化为 RFC 6455&#xff0c;后由 RFC 7936 补充规范。 WebSocket 使得客户端和服务器之间的数…

Python PDF Magic:合并和拆分随心所欲

大家好&#xff01;小编今天要为大家带来一篇关于Python操作PDF的秘籍——无论是要将PDF合并成一份整体&#xff0c;还是将一个庞大的PDF文件拆分成多个小伙伴&#xff0c;都轻松hold住&#xff01;你准备好了吗&#xff1f;让我们开始这场奇妙的PDF操作之旅吧&#xff01; 准…