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

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

相关推荐
云卓科技9 分钟前
无人机之任务分配算法篇
科技·算法·机器人·无人机·交互·制造
DaLi Yao12 分钟前
【笔记】复数基础&&复数相乘的物理意义:旋转+缩放
学习·算法·ai·矩阵
云卓科技12 分钟前
无人机之目标检测算法篇
人工智能·科技·算法·目标检测·计算机视觉·机器人·无人机
wrx繁星点点1 小时前
创建型模式-建造者模式:构建复杂对象的优雅解决方案
java·开发语言·数据结构·数据库·spring·maven·建造者模式
lzmlzm891 小时前
太阳能板表面缺陷裂缝等识别系统:精准目标定位
算法
__AtYou__1 小时前
Golang | Leetcode Golang题解之第507题完美数
leetcode·golang·题解
陈序缘2 小时前
Rust 力扣 - 238. 除自身以外数组的乘积
开发语言·后端·算法·leetcode·rust
AlexMercer10122 小时前
[C++ 核心编程]笔记 4.2.6 初始化列表
开发语言·数据结构·c++·笔记·算法
zzzhpzhpzzz3 小时前
设计模式——享元模式
算法·设计模式·享元模式
夜雨翦春韭3 小时前
【代码随想录Day54】图论Part06
java·开发语言·数据结构·算法·leetcode·图论