「程序员必须掌握的算法」双指针「上篇」

双指针(Two Pointers)是解决算法问题的常用方法之一,它通过维护两个指针在某个序列中游走来解决问题。最常见的双指针问题是在一个有序数组中查找是否存在两个数的和等于目标值。

具体来说,设一个指针 left 初始指向数组第一个元素,一个指针 right 初始指向数组最后一个元素。然后,我们每次将它们的和与目标值比较:

  • 如果两数之和等于目标值,则直接返回结果;
  • 如果两数之和小于目标值,则将 left 指针右移一位;
  • 如果两数之和大于目标值,则将 right 指针左移一位。

这样不断移动指针,直到找到目标值或者 left >= right。下面是一个示例代码:

java 复制代码
public boolean twoSum(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left < right) {
        int sum = nums[left] + nums[right];
        if (sum == target) {
            return true;
        } else if (sum < target) {
            left++;
        } else {
            right--;
        }
    }
    return false;
}

值得注意的是,这里假定数组中的元素是有序的。如果没有排序,我们可以先排序,然后再使用双指针解决问题。当然,也有一些问题不需要排序就可以使用双指针,比如反转字符串、链表等。

另外,维护两个指针的算法并不仅限于两数之和问题。比如在一个字符串中查找最长回文子串,我们可以使用两个指针不断扩展,判断当前子串是否为回文。这个问题的具体解法可以参考我的博客「最长回文子串」。

总之,双指针是一种简单而有效的解决算法问题的方法,程序员在日常开发中必须掌握。

相关推荐
进击的小白菜8 分钟前
如何高效实现「LeetCode25. K 个一组翻转链表」?Java 详细解决方案
java·数据结构·leetcode·链表
拾忆-eleven21 分钟前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法
JK0x0740 分钟前
代码随想录算法训练营 Day39 动态规划Ⅶ 打家劫舍
算法·动态规划
blammmp1 小时前
算法专题四:前缀和
java·开发语言·算法
望未来无悔2 小时前
系统学习算法:动态规划(斐波那契+路径问题)
java·算法
明月看潮生2 小时前
青少年编程与数学 02-018 C++数据结构与算法 25课题、图像处理算法
c++·图像处理·算法·青少年编程·编程与数学
我是一只鱼02232 小时前
LeetCode算法题 (反转链表)Day17!!!C/C++
数据结构·c++·算法·leetcode·链表
LuckyLay2 小时前
LeetCode算法题(Go语言实现)_62
算法·leetcode·职场和发展
元亓亓亓2 小时前
LeetCode热题100--54.螺旋矩阵--中等
算法·leetcode·矩阵
菜鸟破茧计划3 小时前
C++ 算法学习之旅:从入门到精通的秘籍
c++·学习·算法