leetcode题解15-三数之和(双指针经典)
发布日期:2025-04-05 05:05:51 浏览次数:10 分类:精选文章

本文共 1749 字,大约阅读时间需要 5 分钟。

为了判断数字数组中是否存在三个元素使其和为零,并找出所有不重复的三元组,可以按照以下步骤运用排序和双指针技术:

  • 排序数组:首先将数组按照升序排列,这样有利于后续使用双指针法减少重复组合。

  • 初始检查:如果数组长度小于3,直接返回空数组,因为无法构成三个数之和为0的情况。

  • 三重循环中的优化:通过固定一个起始指针i,后面的指针j从i+1开始,指针k从末尾开始移动。这种方法可以保证j的位置单调递增,k的位置单调递减,从而避免重复的组合。

  • 重复检查:为了防止生成重复的三元组,在选择i时,如果前面的元素值与当前元素值相同,应跳过,避免重复。

  • 双指针移动

    • 当三数之和大于0时,应将k指针左移,尝试找到更大的负数。
    • 当三数之和小于0时,将j指针右移,寻找更小的数值。
    • 当和等于0时,生成该组合的三元组,并添加到结果集中。
  • 去重处理:使用集合记录已经找到的三元组,防止重复结果。

  • 以下是实现代码:

    import java.util.ArrayList;import java.util.List;public class Solution {    private List
    > result; public List
    > threeSum(int[] nums) { result = new ArrayList<>(); if (nums.length < 3) { return result; } Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { if (nums[i] > 0) break; // 后面的数都大于0,无法满足条件 // 跳过相同的元素以避免重复 if (i > 0 && nums[i] == nums[i - 1]) { continue; } int j = i + 1; int k = nums.length - 1; List
    > currentList = new ArrayList<>(); int prej = -1; while (j < k) { if (result.contains(nums[i], nums[j], nums[k])) { j++; k--; continue; } int sum = nums[i] + nums[j] + nums[k]; if (sum == 0) { if (prej != -1 && nums[j] == nums[prej]) { k--; j++; continue; } currentList.add(ActivityUtils.newArrayList(nums[i], nums[j], nums[k])); result.add(currentList); prej = j; } else if (sum > 0) { k--; } else { j++; } } } return result; }}

    步骤解释:

  • 排序数组:使用Java的Arrays.sort(nums)对数组进行升序排列。

  • 快速排除不可能情况:如果当前元素大于0,后续元素较大的数无法与它构成和为0的三元组,因此退出循环。

  • 避免重复元素:当i不为0且当前元素等于前一个元素时,跳过当前i,避免重复组合。

  • 双指针遍历:固定i,j从i+1开始,k从末尾开始。计算三数之和,根据和的大小决定j和k的移动方向。

  • 防止重复三元组:使用内置集合检查是否已经存在该三元组,避免重复输出。

  • 收集结果:在发现符合条件的三元组时,添加到结果列表中。

  • 这种方法通过排序和双指针技术,有效地将时间复杂度优化到O(n²),实现高效的三元组检测与收集。

    上一篇:leetcode题解151-翻转字符串里的单词
    下一篇:leetcode题解14-最长公共前缀

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年05月13日 03时22分21秒