题目描述

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。 习题原文

解题思路

求三数之和为 0, nums[i] + nums[j] + nums[k] = 0 可以转换为求两个数之和,也即是 nums[i] + nums[j] = -nums[k]; 那么就可以通过指针移动去查找满足公式的数字,而为了方便控制指针的移动,前提是一组数字是有序的。

那么大概的解题思路如下:

  • 对数组排序
  • 定义三个指针 i, left, right; 指针 i 指向的是求和项,指针 left, right 分别指向数组的头部和尾部
  • 当 -nums[i] = nums[left] + nums[right] 时满足公式,指针 left, right 继续向中部移动
  • 当 -nums[i] > nums[left] + nums[right] 时指针 left 向中部移动
  • 当 -nums[i] < nums[left] + nums[right] 时指针 righr 向中部移动
  • 当指针 left,right 交叉时停止移动,指针 i 向下移动,指针 left, right 重置

其流程如下图所示:

实现

public static List<List<Integer>> solution(int[] nums) {// 排序Arrays.sort(nums);List<List<Integer>> rs = new ArrayList<>();int i = 0, left = 1, right = nums.length - 1;while (i < nums.length - 2) {while (true) {// 左右指针交叉退出if (right <= left) {break;}if (-nums[i] == nums[left] + nums[right]) {rs.add(Arrays.asList(nums[i], nums[left], nums[right]));// 过滤同一结果内重复的数字// 左右指针继续向中间移动while (true) {if (left >= nums.length - 1) {break;}if (nums[left] != nums[left + 1]) {left++;break;} else {left++;}}while (true) {if (right <= 0) {break;}if (nums[right] != nums[right - 1]) {right--;break;} else {right--;}}continue;}if (-nums[i] <= nums[left] + nums[right]) {right--;continue;}if (-nums[i] > nums[left] + nums[right]) {left++;continue;}}// 过滤同一结果值的数字while (true) {if (i >= nums.length - 1) {break;}if (nums[i] != nums[i + 1]) {i++;break;} else {i++;}}//i++;left = i + 1;right = nums.length - 1;}return rs;
}

LeetCode-数组-三数之和相关推荐

  1. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

  2. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  3. 20200126:(leetcode)三数之和 最接近的三数之和(含图解)

    三数之和 && 最接近的三数之和 题目 基本思路 代码实现 题目 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b ...

  4. Leetcode 15.三数之和

    Time: 20190920 Type: Medium 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所 ...

  5. Leetcode 15:三数之和(最详细解决方案!!!)

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. **注意:**答案中不可以包含重 ...

  6. Java实现 LeetCode 15 三数之和

    15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...

  7. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  8. 用 PHP 来刷leetCode 之 三数之和

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  9. LeetCode 15. 三数之和【双指针】

    15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...

  10. LeetCode 15. 三数之和

    题目描述 15. 三数之和 思路 思路1 比较容易想到的就是,求三数之和等于0,可以等价于求两个数的和,然后看这个和的相反数是否在nums里面. 但是 T_T这样的话复杂度太高了,会超时,捂脸,最后三 ...

最新文章

  1. 「mysql优化专题」90%程序员都会忽略的增删改优化(2)
  2. 天气预报c是什么意思_大雪节气将至,为什么老话说:寒风迎大雪,三九天气暖?...
  3. PHP全栈学习笔记10
  4. 电商第一季函数笔记(1)
  5. python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?
  6. Strategy(策略)--对象行为型模式
  7. java的网络功能与编程_Java的网络功能与编程(转载)
  8. 「Python 编程」编码实现网络请求库中的 URL 解析器
  9. R语言系列:多元统计分析简介
  10. TCP报文段的首部格式
  11. Linux-lamp
  12. list集合排序_Java面试第七部分 Java的集合
  13. 【manjaro安装最新的搜狗输入法】2022年1月4号有效测试
  14. 你不知道的HelloGitHub!
  15. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
  16. arm_neon.h引用
  17. 【Arduino基础】一位数码管实验
  18. 解决局域网无法自动获取ip问题
  19. SVG实现带动画效果的购物图标
  20. JAVA控制台注册用户

热门文章

  1. kcp 介绍与源代码分析_Mendel:基于遗传隐喻的源代码推荐
  2. transform: translate()
  3. python中*args **kwargs
  4. Different Integers
  5. Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建
  6. jQuery学习笔记(五)
  7. Android RxJava(一) create操作符的用法和源码分析
  8. MEF实现设计上的“松耦合”(一)
  9. Android学习点点滴滴之获取正在运行的进程
  10. Fabric学习笔记(一)- Centos 7下的Fabric 2.3.2环境搭建