双指针-01-三数之和

文章目录

  • [1. 题目描述](#1. 题目描述)
  • [2. 思路](#2. 思路)
  • [3. 代码](#3. 代码)

1. 题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

2. 思路

根据题意可知,程序需要满足以下条件:

  • 元素下标不可重复
  • 三元组值不能重复

因此,应先对整个数组按照从小到大的顺序排序 ,避免不必要的遍历。然后使用双指针法,遍历数组时对于每个元素都指定双指针,一个最左,一个最右,能够减少一半的遍历开销,还能数组下标不重复。

3. 代码

java 复制代码
public static List<List<Integer>> threeSum(int[] nums) {
    if (nums.length < 3 || nums.length > 3000){
        return new ArrayList<>();
    }

    Arrays.sort(nums);
    List<List<Integer>> result = new ArrayList<>();

    for (int i = 0; i < nums.length - 2; i++) {
        //跳过重复的i
        if (i > 0 && nums[i] == nums[i-1]){
            continue;
        }

        int left = i+1;
        int right = nums.length - 1;
        while (left < right){
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0){
                result.add(Arrays.asList(nums[i],nums[left],nums[right]));

                //跳过重复的left
                while (left < right && nums[left] == nums[left + 1]){
                    left++;
                }
                //跳过重复的right
                while (left < right && nums[right] == nums[right - 1]){
                    right --;
                }
                //注意还要更新指针
                left++;
                right--;

            }else if (sum < 0){
                left ++;
            }else {
                right --;
            }
        }
    }

    return result;
}

以上为个人学习分享,如有问题,欢迎指出:)

相关推荐
AI软著研究员6 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish7 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱8 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法