十五周算法训练营——快慢指针

news2025/1/12 18:47:49

今天是十五周算法训练营的第八周,主要讲快慢指针专题。(欢迎加入十五周算法训练营,与小伙伴一起卷算法)

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

利用快慢指针解决,如果fast遇到val就跳过,否则就赋值给slow指针,并让slow指针前进一步。

// 利用快慢指针解决,如果fast遇到val就跳过,否则就赋值给slow指针,并让slow指针前进一步
function removeElement(nums, val) {
    let slow = 0;
    let fast = 0;

    while (fast < nums.length) {
        // 当快指针等于对应值时,则跳过
        if (nums[fast] != val) {
            nums[slow] = nums[fast];
            slow++;
        }

        // 快指针每次都前进一步
        fast++;
    }

    return slow;
}

const nums = [3, 2, 2, 3];

console.log(removeElement(nums, 3));

移动零

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

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

「示例 1:」

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

用快慢指针解决,首先去除所有零点,然后慢指针后面的赋值为0

function moveZeroes(nums) {
    // 1. 首先去除所有的零点
    // 2. 将去除元素后,慢指针后面的赋值为0

    let slow = 0;
    let fast = 0;

    while (fast < nums.length) {
        if (nums[fast] !== 0) {
            nums[slow] = nums[fast];
            slow++;
        }

        fast++;
    }

    for (let i = slow; i < nums.length; i++) {
        nums[i] = 0;
    }

    return nums;
}

const nums = [0,1,0,3,12];
console.log(moveZeroes(nums));

删除数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

利用快慢指针实现,当快慢指针不相等时,就证明找到了一个新的元素,此时将慢指针移动一下,将新值赋值给慢指针。

// 利用快慢指针实现,当快慢指针不相等时,就证明找到了一个新的元素,此时将慢指针移动一下,将新值赋值给慢指针
function removeDuplicates(nums) {
    let slow = 0;
    let fast = 0;

    while (fast < nums.length) {
        if (nums[slow] !== nums[fast]) {
            slow++;
            nums[slow] = nums[fast];
        }
        fast++;
    }

    return slow + 1;
}

const nums = [1,1,2];
console.log(removeDuplicates(nums));

链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

function listNode(val, next) {
    this.val = val;
    this.next = next === undefined ? null : next;
}
// 利用快慢指针解决
// 注意链表长度奇偶的问题,奇数返回的就是中间那个,偶数返回的则是两个中间点中的后一个
function middleNode(head) {
    // 快慢指针初始化
    let slow = head;
    let fast = head;

    // 快指针走到末尾时停止
    while (fast !== null && fast.next !== null) {
        // 快指针走两步、慢指针走一步
        fast = fast.next.next;
        slow = slow.next;
    }

    // 慢指针指向中点
    return slow;
}

删除链表中的倒数第n个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

5d1cbe473bc7c073ac120db9e75fb757.jpeg
img

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

  • 用双指针p1、p2,然后p1先走n+1步

function ListNode(val, next) {
    this.val = val;
    this.next = next === undefined ? null : next;
}

function removeNthFromEnd(head, n) {
    // 创建一个空节点,方便删除第一个节点的情况
    const dummy = new ListNode(null, head);
    let p1 = dummy;
    let p2 = dummy;

    // 因为要删除倒数第n个节点,则p1则必须先走n + 1步,否则找到的则是倒数第n个,不能进行删除
    for (let i = 0; i < n + 1; i++) {
        p1 = p1.next;
    }

    // p1和p2一起往后走,知道p1走到终点,这样p2就是要删除的点
    while (p1 != null) {
        p1 = p1.next;
        p2 = p2.next;
    }

    // 删除倒数第n个节点
    p2.next = p2.next.next;

    return dummy.next;
}

const listNode = new ListNode(1, null);
listNode.next = new ListNode(2, null);
listNode.next.next = new ListNode(3, null);
listNode.next.next.next = new ListNode(4, null);
listNode.next.next.next.next = new ListNode(5, null);

console.log(JSON.stringify(removeNthFromEnd(listNode, 2)));

和为s的两个数字

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

「示例 1:」

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
// 通过双指针解决
function twoSum(nums, target) {
    let left = 0;
    let right = nums.length - 1;

    while (left < right) {
        const sum = nums[left] + nums[right];
        if (sum === target) {
            return [nums[left], nums[right]];
        } else if (sum > target) {
            right--;
        } else {
            left++;
        }
    }

    return [];
}

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

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

相关文章

UDF提权(linux)

实验环境&#xff1a; RAVEN靶场&#xff1a;链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;g6oz 攻击机&#xff1a;kali 2023.3 IP&#xff1a;192.168.126.142 关于UDF提权&#xff0c;需要满足的条件是 1.数据库管理员权限运行 #如果权限过低&#xff…

安装docker compose

1.定义 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务&#xff0c;然后使用一个命令来创建并启动所有服务。Compose 有三个主要步骤&#xff1a; - 使用 Dockerfile 定义应用…

简历里项目经历怎么写,没有项目经历怎么办?

在撰写简历时&#xff0c;项目经历是一个非常重要的部分&#xff0c;能够有效地展示个人的能力和经验。但是&#xff0c;如果你没有项目经历怎么办呢&#xff1f;以下是一些关于如何写简历项目经历的建议&#xff0c;以及如何克服没有项目经历的挑战。 一、如何写简历项目经历 …

史上最详细的RACI(责任分配矩阵)使用方法及实例详解

作为PMO和项目经理一定对于RACI责任分配矩阵不陌生&#xff0c;但是很少有人真正用起来&#xff0c;RACI是一个广泛应用于项目管理的模型&#xff0c;用于明确角色和责任。 在项目的不同阶段或任务中&#xff0c;RACI模型有助于划分和理解团队成员的责任。今天咱们就为大家详细…

R语言绘制山脊图(也叫峰峦图、山峦图)

山脊图也叫也叫峰峦图、山峦图&#xff0c;主要是通过展示一个相同的X轴数据&#xff0c;可以是时间序列、基因数据等&#xff0c;对应不同的Y轴数据&#xff0c;清晰的展示不同数据见变量的关系。今天我们通过R语言来演示山脊图。需要使用到ggridges包&#xff0c;需要提前安装…

Hive ---- 查询

Hive ---- 查询 1. 基础语法2. 基本查询&#xff08;Select…From&#xff09;1. 数据准备2. 全表和特定列查询3. 列别名4. Limit语句5. Where语句6. 关系运算函数7. 逻辑运算函数8. 聚合函数 3. 分组1. Group By语句2. Having语句 4. Join语句1. 等值Join2. 表的别名3. 内连接…

vue:el-table初始化表格选中项踩坑记录/element-ui表格

问题描述 首先&#xff0c;element-ui表格多选功能可以参考官网示例&#xff1a;表格数据多选&#xff1b;手动在表格中选取数据、通过监听selection-change获取选中项&#xff0c;实现起来非常顺利~ 但在保存了选项、重新加载表格时&#xff0c;希望将已选项“打勾”却完全没…

这篇文章告诉你excel批量翻译有什么方法

在商业或个人领域中&#xff0c;我们有时需要将大量文本翻译成不同语言&#xff0c;例如跨国企业需要在不同的国家和地区之间进行文件传输和协作&#xff0c;在旅行时我们需要阅读当地语言的信息或地图。如果我们手动操作的话&#xff0c;是非常耗时且容易出错的&#xff0c;所…

知识管理、文档管理两手抓,全靠它!

知识管理和文档管理是两个相互关联的概念&#xff0c;两者之间的关系非常密切。知识管理是指对组织内外的知识资源进行收集、整理、存储、共享和应用的过程&#xff0c;旨在提高组织的绩效和创新能力。而文档管理是指对组织内外的文档资源进行收集、整理、存储、共享和应用的过…

chatgpt赋能Python-python_heading__

Python heading()方法&#xff1a;提高网页的SEO效果 介绍 在网页开发过程中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是一个重要的考虑因素。网页的排名和可见性对于用户的访问和广告收益非常重要。好的SEO可以大大提高网页的可见性和流量。因此&#xff0c;网页…

SolVES模型生态系统服务功能社会价值评估

查看原文>>>SolVES 模型生态系统服务功能社会价值评估&#xff08;基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言&#xff09; 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…

【追梦之旅】— 堆的实际应用--TopK问题

【追梦之旅】— 堆的实际应用--TopK问题&#x1f60e; 前言&#x1f64c;堆的TopK问题的现实栗子堆的TopK思路的应用场景堆的TopK思路的具体实现fscanf函数fprintf函数堆的TopK具体实现代码&#xff1a;前K个数据的巧妙设置运行结果截图&#xff1a; 总结撒花&#x1f49e; &am…

chatgpt赋能Python-python_ip地址判断

Python IP地址判断 - 从入门到精通 如果您是一个开发人员并且经常需要处理网络相关的任务&#xff0c;那么您一定知道 IP 地址是什么。 IP 地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是网络中用于标识设备的唯一标识符。 在本篇文章中&#xff0c;您…

chatgpt赋能Python-python_iloc

Python iLoc的使用方法及其在数据处理中的应用 Python是一种灵活的编程语言&#xff0c;可以在数据科学领域中广泛应用。在数据处理中&#xff0c;许多人都熟悉Pandas数据框架。本篇文章将介绍Pandas中的iloc方法&#xff0c;以及如何在数据处理中使用它。 iloc方法是什么? …

基于html+css的图展示87

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

CryoEM - 冷冻电镜 CryoSPARC 单颗粒图像数据集构建

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130822537 CryoSPARC 的 downsample 操作是一种用于减少数据集大小的技术,可以提高计算效率和内存使用率。downsample 操作的原理是将原始图像的分辨率降低…

SpringBoot是如何简化配置的

Spring Boot 如何简化配置&#xff1f; Spring Boot 是一个基于 Spring 框架的快速开发框架&#xff0c;它可以大大简化应用程序的配置过程。本文将介绍 Spring Boot 是如何简化配置的&#xff0c;并提供相关的代码示例。 一、自动化配置 Spring Boot 的自动化配置功能可以根…

C++【实现AVL树】

文章目录 一、AVL树的概念及性能二、AVL树结点的创建三、AVL树的插入四、四种旋转&#xff08;1&#xff09;LL-左单旋&#xff08;2&#xff09;RR-右单旋&#xff08;3&#xff09;LR-左右旋&#xff08;4&#xff09;RL-右左旋 五、判断AVL树六、测试结果七、源代码(1) AVL_…

低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!

客户背景概述 浙江广播电视集团&#xff08;以下简称浙江台&#xff09;是一家以广播电视为主业,兼营相关产业的综合媒体集团&#xff0c;是国内最具影响力的省级媒体之一。因新业务拓展需要&#xff0c;浙江台也需随之上线一套全新的媒资平台系统进行运营支撑&#xff0c;而新…

2023年湖北助理工程师个人申报怎么申请?

这是许多出入职场的人&#xff0c;比较关心的话题&#xff0c;想要申请一个助理工程师怎么办呢&#xff1f;助理职称好不好办&#xff1f;助理工程师职称个人怎么申请呢&#xff1f;助理工程师申需要什么材料呢&#xff1f;助理工程师申报有什么流程呢&#xff1f;甘建二现在教…