带你读《图解算法小抄》十九、双指针(1)

简介: 带你读《图解算法小抄》十九、双指针(1)

十九、双指针

访问 www.coding-time.cn 阅读原文动画效果,体验更佳。


1.双指针技巧的详解


双指针技巧是一个经常在各类算法题目中出现的解决问题的策略。这种策略主要用于解决需要在一个线性结构(例如数组或链表)中查找、修改或比较元素的问题。双指针技巧通常用于优化暴力求解或其他高复杂度解法,减少时间和空间复杂度。

1双指针的主要应用

以下是双指针技巧的主要应用:

 

  • 对撞指针:两个指针从不同的方向向中间移动,通常用于有序数组或链表的问题,例如「两数之和」、「反转字符串」。
  • 快慢指针:两个指针以不同的速度移动,通常用于链表问题,例如「检测环」、「找到中点」。
  • 滑动窗口:两个指针维护一个窗口,通常用于数组或链表的连续或固定大小子序列问题,例如「无重复字符的最长子串」、「最小覆盖子串」。

2算法框架

以下是一个一般性的双指针技巧的算法框架:

 

function doublePointer(arr) {
    let left = 0, right = 0;
let ans = ...;  // 根据具体问题确定初始值
    while (right < arr.length) {
        // 根据具体问题更新答案
        // ...        // 移动右指针
        right++;
        while (/*根据具体问题确定左指针何时移动的条件*/) {
            // 移动左指针
            left++;
        }
}
    return ans;
}

 

注意,这个框架可能需要根据具体问题进行一些微调。

3双指针技巧的应用举例

以下是双指针技巧在不同问题上的应用:

a)对撞指针:「反转字符串」

function reverseString(s) {
    let left = 0, right = s.length - 1;
    while (left < right) {
        let temp = s[left];
        s[left++] = s[right];
        s[right--] = temp;
}
}

b)快慢指针:「寻找链表中点」

function middleNode(head) {
    let slow = head, fast = head;
    while (fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
    }
return slow;
}

c)滑动窗口:「无重复字符的最长子串」

function lengthOfLongestSubstring(s) {
    let map = {};
    let longest = 0;
    let start = 0;
    for (let i = 0; i < s.length; i++) {
        let char = s[i];
        if (map[char] !== undefined) {
            start = Math.max(start, map[char] + 1);
        }
        map[char] = i;
        longest = Math.max(longest, i - start + 1);
    }
    return longest;
}


带你读《图解算法小抄》十九、双指针(2)https://developer.aliyun.com/article/1348033?groupCode=tech_library

相关文章
|
11天前
|
算法
双指针算法
双指针算法
9 2
|
27天前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
2月前
|
算法
【优选算法】——双指针——15. 三数之和
【优选算法】——双指针——15. 三数之和
【优选算法】——双指针——15. 三数之和
|
2月前
|
存储 人工智能 算法
c++算法学习笔记 (9) 双指针
c++算法学习笔记 (9) 双指针
|
2月前
|
算法
[优选算法]——双指针——Leetcode——1089. 复写零
[优选算法]——双指针——Leetcode——1089. 复写零
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
17天前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
2月前
|
算法 前端开发 JavaScript
< 每日算法:一文带你认识 “ 双指针算法 ” >
`双指针`并非指的是一种具体的公式或者范式。而是一种运算思路,用于节省逻辑运算时间的`逻辑思路`!双指针算法通常用于`优化时间复杂度`!
< 每日算法:一文带你认识 “ 双指针算法 ” >
|
2月前
|
存储 算法 容器
算法:双指针
算法:双指针
25 3
|
2月前
|
算法 C++
【优选算法】——双指针——18. 四数之和
【优选算法】——双指针——18. 四数之和