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

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

相关推荐
平凡但不平庸的码农2 小时前
Go Slice 详解
算法·golang
炸膛坦客5 小时前
嵌入式 - 数据结构与算法:(1-7)数据结构 - 顺序表和链表的对比
数据结构·链表
Jasmine_llq6 小时前
《B3867 [GESP202309 三级] 小杨的储蓄》
算法·循环遍历·数组累加(模拟)·索引定位·顺序输出
啦啦啦_99996 小时前
案例之 逻辑回归_电信用户流失预测
算法·机器学习·逻辑回归
风筝在晴天搁浅6 小时前
快手/字节 CodeTop LeetCode 415.字符串相加
算法·leetcode
hoiii1876 小时前
基于栅格法的机器人工作空间划分系统
数据结构·机器人
DragonnAi7 小时前
猫咪如厕检测与分类识别系统系列【十四】 项目结构重新整理-即将开源完整算法
算法·开源
机器视觉_Explorer7 小时前
【halcon】编程技巧:鼠标擦除
图像处理·人工智能·深度学习·算法·视觉检测
灵智实验室8 小时前
PX4状态估计技术EKF2详解(二):EKF2 误差状态动力学与协方差传播
算法·无人机·px 4
米粒18 小时前
力扣算法刷题 Day 64 Floyd算法 & A* 算法 & 总结篇
算法·leetcode·职场和发展