双指针技巧秒杀七道数组题目

简介: 本文介绍双指针技巧在数组和链表中的应用,涵盖快慢指针与左右指针。通过力扣多道经典题目,如删除重复项、两数之和等,详解如何用快慢指针实现原地修改,提升算法效率。内容覆盖数组与链表去重、链表环检测等常见问题,适合巩固基础算法思维。(239字)

LeetCode 力扣 难度

  1. Two Sum II - Input Array Is Sorted 167. 两数之和 II - 输入有序数组 🟠
  2. Remove Duplicates from Sorted Array 26. 删除有序数组中的重复项 🟢
  3. Remove Element 27. 移除元素 🟢
  4. Move Zeroes 283. 移动零 🟢
  5. Reverse String 344. 反转字符串 🟢
  6. Longest Palindromic Substring 5. 最长回文子串 🟠
  7. Remove Duplicates from Sorted List 83. 删除排序链表中的重复元素 🟢
  • 剑指 Offer 57. 和为s的两个数字 🟢
  • 剑指 Offer II 006. 排序数组中两个数字之和 🟢
    处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类:左右指针和快慢指针。所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行,一快一慢。对于单链表来说,大部分技巧都属于快慢指针,单链表的六大解题套路 都涵盖了,比如链表环判断,倒数第 K 个链表节点等问题,它们都是通过一个 fast 快指针和一个 slow 慢指针配合完成任务。
    在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针,这样也可以在数组中施展双指针技巧,本文主要讲数组相关的双指针算法
    快慢指针技巧
    原地修改
    数组问题中比较常见的快慢指针技巧,是让你原地修改数组。
    比如说看下力扣第26题「删除有序数组中的重复项」,让你在有序数组去重:
  1. 删除有序数组中的重复项 | 力扣 | LeetCode | 🟢
    给你一个 非严格递增排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
    考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
    ● 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
    ● 返回 k 。
    判题标准:
    系统会用下面的代码来测试你的题解:
    int[] nums = [...]; // 输入数组
    int[] expectedNums = [...]; // 长度正确的期望答案
    int k = removeDuplicates(nums); // 调用
    assert k == expectedNums.length;
    for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
    }
    如果所有断言都通过,那么您的题解将被 通过。
    示例 1:
    输入:nums = [1,1,2]
    输出:2, nums = [1,2,_]
    解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
    示例 2:
    输入:nums = [0,0,1,1,1,2,2,3,3,4]
    输出:5, nums = [0,1,2,3,4]
    解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
    提示:
    ● 1 <= nums.length <= 3 * 104
    ● -104 <= nums[i] <= 104
    ● nums 已按 非严格递增 排列
    函数签名如下:
    int removeDuplicates(int[] nums);
    简单解释一下什么是原地修改:
    如果不是原地修改的话,我们直接 new 一个 int[] 数组,把去重之后的元素放进这个新数组中,然后返回这个新数组即可。但是现在题目让你原地删除,不允许 new 新数组,只能在原数组上操作,然后返回一个长度,这样就可以通过返回的长度和原始数组得到我们去重后的元素有哪些了。
    由于数组已经排序,所以重复的元素一定连在一起,找出它们并不难。但如果毎找到一个重复元素就立即原地删除它,由于数组中删除元素涉及数据搬移,整个时间复杂度是会达到 O(N2)O(N2)。
    高效解决这道题就要用到快慢指针技巧:
    我们让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就赋值给 slow 并让 slow 前进一步。这样,就保证了 nums[0..slow] 都是无重复的元素,当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是整个数组去重之后的结果。
    看代码:
    class Solution {
    public int removeDuplicates(int[] nums) {
    if (nums.length == 0) {
        return 0;
    }
    int slow = 0, fast = 0;
    while (fast < nums.length) {
        if (nums[fast] != nums[slow]) {
            slow++;
            // 维护 nums[0..slow] 无重复
            nums[slow] = nums[fast];
        }
        fast++;
    }
    // 数组长度为索引 + 1
    return slow + 1;
    
    }
    }
    再简单扩展一下,看看力扣第 83 题「删除排序链表中的重复元素」,如果给你一个有序的单链表,如何去重呢?其实和数组去重是一模一样的,唯一的区别是把数组赋值操作变成操作指针而已,你对照着之前的代码来看:
    class Solution {
    public ListNode deleteDuplicates(ListNode head) {
    if (head == null) return null;
    ListNode slow = head, fast = head;
    while (fast != null) {
        if (fast.val != slow.val) {
            // nums[slow] = nums[fast];
            slow.next = fast;
            // slow++;
            slow = slow.next;
        }
        // fast++
        fast = fast.next;
    }
    // 断开与后面重复元素的连接
    slow.next = null;
    return head;
    
    }
    }
相关文章
|
网络协议 数据处理 数据格式
51单片机ESP8266云端通信的实现
51单片机ESP8266云端通信的实现
1061 1
|
5月前
|
存储 JavaScript 前端开发
XSS攻击
XSS(跨站脚本攻击)是攻击者通过网站漏洞注入恶意脚本,用户访问时执行,窃取数据、Cookie或劫持会话。主要分反射型和存储型,危害大。防御措施包括输入转义、白名单过滤及CSP内容安全策略,有效防止脚本注入。
|
5月前
|
缓存 监控 JavaScript
前端性能监控指标
前端性能指标包括白屏时间、首屏时间、DOM可操作时间和页面总加载时间。可通过注入代码或`window.performance` API进行量化统计,后者基于浏览器标准接口,提供精确的网络、解析与渲染各阶段耗时数据,助力性能优化。
|
5月前
|
JavaScript 前端开发 测试技术
Angular框架
本文深入解析Angular核心概念,涵盖ng-show与ng-if的性能差异、$rootScope与$scope的关系、表达式机制、Digest周期、定时器与监听器的取消方法。同时探讨Directive的restrict属性、作用域绑定方式及模块间通信策略。此外,介绍性能优化技巧、单元测试实践、Angular 2生命周期钩子、路由机制、事件发射器、AOT编译、安全防护与Shadow DOM等高级主题,全面提升开发技能。
|
5月前
|
域名解析 缓存 边缘计算
CDN加速
CDN(内容分发网络)通过在全球部署节点服务器,将源站内容缓存至边缘节点,用户访问时由最近节点提供服务。基于DNS重定向与智能调度,实现就近加速,降低延迟,提升访问速度与网站可用性,有效应对高并发、带宽不足等问题。
|
5月前
|
人工智能 弹性计算 应用服务中间件
阿里云建站费用价格整理:3种建网站方法,价格优惠,哪个更适合你?
阿里云建站费用大揭秘!3种方式任选:会技术可选38元/年起云服务器自建站;无基础推荐万小智AI建站,698元/年起送CN域名;企业定制选云·企业官网,专业设计5480元/年起。价格透明,优惠多多,适合个人到大型企业不同需求,轻松搭建专属网站。
301 3
|
9月前
|
存储 Linux 测试技术
HPE SPP 2025.07.00.00 - HPE 服务器固件、驱动程序和系统软件包
HPE SPP 2025.07.00.00 - HPE 服务器固件、驱动程序和系统软件包
371 4
|
8月前
|
关系型数据库 MySQL 数据库
云时代MySQL:RDS与自建数据库的抉择
在云计算时代,选择合适的数据库部署方案至关重要。本文深入对比了AWS RDS与自建MySQL的优劣,帮助您在控制权、运维成本和业务敏捷性之间找到最佳平衡点。内容涵盖核心概念、功能特性、成本模型、安全性、性能优化、高可用方案及迁移策略,为您提供全面的决策参考。
|
安全 数据库
阿里云服务器被挖矿怎么解决
春节刚开始,我们SINE安全,发布了2018年服务器被挖矿的整体安全分析报告。该安全报告主要是以我们去年的整一年的安全数据为基础,对这些服务器的被挖矿的整体情况进行了详细的安全分析,为站长以及一些中小企业公司提出了合理的服务器安全防护建议。
10284 109
端口被占用 --- 解决方案
端口被占用 --- 解决方案
685 0