双指针-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;
}

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

相关推荐
ULTRA??12 小时前
各种排序算法时间复杂度分析和实现和优势
c++·python·算法·排序算法
sprintzer12 小时前
12.06-12.15力扣分治法刷题
算法·leetcode
月明长歌12 小时前
【码道初阶】【牛客BM30】二叉搜索树与双向链表:java中以引用代指针操作的艺术与陷阱
java·数据结构·算法·leetcode·二叉树·笔试·字节跳动
hoiii18712 小时前
使用RPCA算法对图像进行稀疏低秩分解
人工智能·算法
yuuki23323312 小时前
【C++】内存管理
java·c++·算法
刃神太酷啦12 小时前
Linux 进程核心原理精讲:从体系结构到实战操作(含 fork / 状态 / 优先级)----《Hello Linux!》(6)
java·linux·运维·c语言·c++·算法·leetcode
一个不知名程序员www12 小时前
算法学习入门---二叉树
c++·算法
小李小李快乐不已12 小时前
数组&&矩阵理论基础
数据结构·c++·线性代数·算法·leetcode·矩阵
feifeigo12312 小时前
SVM分类在高光谱遥感图像分类与预测中的应用
算法·支持向量机·分类
三川69812 小时前
AVL树的学习
数据结构·学习·算法