双指针-01-三数之和

文章目录

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

1. 题目描述

给你一个整数数组 nums ,判断是否存在三元组 nums\[i, numsj, numsk] 满足 i != j、i != k 且 j != k ,同时还满足 numsi + numsj + numsk == 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;
}

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

相关推荐
kkeeper~11 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
2401_8685347811 小时前
论企业网络设计
数据结构
wabs66612 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_8769641313 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚13 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本13 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov15 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫15 小时前
特征工程处理
人工智能·算法·机器学习
z落落15 小时前
C#参数区别
java·算法·c#
c2385616 小时前
vector(下)
数据结构·算法