算法之双指针法的应用

457 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

关于算法系列已更新部分文章,后续会陆续增加内容:

【1】 算法之用动态规划实现斐波那契数列

【2】 算法之双指针法的应用

【3】 算法之链表的含义

双指针法

双指针并不是指真正的指针,而是一种比较形象的描述方式。常用于数组、字符串和链表的操作中,它更多情况下是用来表示下标。

双指针也称为快慢指针,在有些题目背景下,指针会有快慢之分,形成一定的下标差。

指针的位置根据不同的题目可能会出现在左侧、右侧、或者两端,具体情况要具体分析。

image.png

image.png

image.png

应用场景

  • 删除有序数组的重复项
  • 有序数组的平方
  • 移除元素
  • 替换空格
  • 反转字符串
  • ......

双指针法可以解决的问题大致分为两种类型:

  1. 删除或者覆盖元素
  2. 交换元素位置

双指针法应用——反转字符串

实现反转字符串的方式不止一种,在这里使用双指针法来实现

题目描述: 编写一个函数,将输入的字符串反转过来。( 注:不分配额外的空间,使用 O(1) 的空间复杂度来实现这一问题)

输入: s = ["h","e","l","l","o"]

输出: ["o","l","l","e","h"]

力扣题目链接: 反转字符串

思路: 在字符串的左右两端分别设定指针,循环的过程中不断交换两端元素,并进行i++、j--,直到i>=j停止交换。

注意 while 循环的范围是 i<j,因为无论数组元素的个数是奇数还是偶数,i 和 j 会一直保持一种小于的关系,直到条件不成立,循环停止。

元素交换:

数组元素交换的方法:

  1. [a,b] = [b,a]
  2. temp = a; a = b; b = a;

代码实现:

var reverseString = function(s) {
    let i = 0,j = s.length - 1,temp;
    while(i<j){
        //temp = s[i];
        //s[i] = s[j];
        //s[j] = temp;
        [s[i], s[j]] = [s[j], s[i]] // 数组元素交换
        i++;
        j--;
    }
    return s;
};