题目描述

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

注意:

  1. 三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
  2. 解集中不能包含重复的三元组。
例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)

示例1

输入

[-2,0,1,1,2]

返回值

[[-2,0,2],[-2,1,1]]

本问题有多种解法,此处用ArrayList的方法

  1. 首先要判断数组num是否为空
  2. 将数组排序,(排序有多种方法)
  3. 遍历数组,分析题目可知,三个数相加等于零,此时的数组num已经是排过序的,由小到大的顺序,所以第一个数字如果大于0的话,那么后面的数一定都大于0,所以此处可以加一个判断。
  4. 由于存在list1是一个三元组的形式,所以此处还需再设一个ArrayList来接收满足要求的三个数,再将这个集合放入list1中.代码如下:
import java.util.ArrayList;
import java.util.Arrays;public class ThreeSum {public static void main(String[] args) {int[] num = {-10, 0, 10, 20, -10, -40};ThreeSum threeSum = new ThreeSum();ArrayList<ArrayList<Integer>>  result = threeSum.threeSum(num);for(ArrayList<Integer> tempList : result){for(Integer index : tempList){System.out.print(index+" ");}System.out.println();}}public ArrayList<ArrayList<Integer>> threeSum(int[] num) {ArrayList<ArrayList<Integer>> list1=new ArrayList<>();if(num==null){return list1;}// 将数组排序,(排序有多种方法)Arrays.sort(num);for(int i=0;i<num.length-2;i++){// 数组num已经是排过序的,由小到大的顺序。该位置数字如果大于0的话,那么后面的数一定都大于0if(num[i]>0){break;}// 去掉重复的if(i!=0 && num[i]==num[i-1]){continue;}for(int j=i+1;j<num.length-1;j++){if(j!=i+1 && num[j]==num[j-1]){continue;}for(int k=j+1;k<num.length;k++){if(k!=j+1 && num[k]==num[k-1]){continue;}int sum=num[i]+num[j]+num[k];if(sum==0){ArrayList<Integer> list=new ArrayList<>();list.add(num[i]);list.add(num[j]);list.add(num[k]);list1.add(list);}}}}return list1;}
}

常考数据结构与算法:数组中相加和为0的三元组相关推荐

  1. 常考数据结构与算法:数组中未出现的最小正整数

    参考博客 https://www.cnblogs.com/apeway/p/10764597.html 题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, ...

  2. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  3. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  4. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  5. 常考数据结构与算法:在转动过的有序数组中寻找目标值

    题目描述 给出一个转动过的有序数组,你事先不知道该数组转动了多少 (例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2). 在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引, ...

  6. 常考数据结构与算法:子数组中的最大累加和问题

    题目描述 给定一个数组arr,返回子数组的最大累加和 例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12. ...

  7. 数据结构与算法--数组中出一次的数字

    数组中出现一次的数字 题目:一个整型数组里面除了一个数字以外,其他数字都出现了两次.找出这个出现一次的数字,时间复杂度O(n),空间复杂度O(1) 如上题中最简单的方法就是一次循环统计,之后在循环判断 ...

  8. 数据结构与算法--数组中的逆序对

    题目:在数组中的两个数字如果签名一个数字大于后面的数组,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 案例:输入数组{7,5,6,4}中一共有5个逆序对分别是{7,6},{ ...

  9. 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)

    时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...

最新文章

  1. idea编译工程时出现Error:java: 无效的目标发行版: 1.8
  2. twitter自定义api_为Twitter4j创建自定义SpringBoot Starter
  3. 共享学习:蚂蚁金服数据孤岛解决方案
  4. Enze frist day
  5. ERROR in ./src/css/1.scss 1:2
  6. GIT提交记录和Revert commit过程分析
  7. 华为交换机开机后接口等一直闪_交换机的工作原理
  8. android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView
  9. 台式linux桌面远程链接华为云windows服务器桌面
  10. win10安装mysql zip_win10 安装mysql zip 压缩包版
  11. freeswitch 用户配置详解_FreeSwitch配置和使用手册
  12. 第5-5课:最大流问题(图文篇)
  13. 基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件、
  14. 80286/286/Intel286 架构/流水线及其优化
  15. 【WordExcel】【1】更新Word的目录
  16. ML-Agents命令及配置大全
  17. Python正则re模块详解
  18. Linux系统下操作Oracle数据库
  19. mysqlit根据稀有值随机选择_三中锋教练来过了!实况足球20赛季DP7.0后新增稀有阵型top10...
  20. 《微信公众平台与小程序开发——从零搭建整套系统》第1章 微信生态

热门文章

  1. 团队任务3:每日立会(2018-10-18)
  2. POJ 1860 Currency Exchange
  3. 全国计算机技术与软件专业技术资格(水平)考试【软件评测师】-考试内容总结(四)中间件基础知识...
  4. PHPcms 系统简单使用
  5. 升级GCC 4.6后的warning: ”variable set but not used“
  6. centos6.0下ffmpeg的安装编译经历
  7. 小白学数据分析-----回归分析在游戏人气分析的应用探索
  8. 关于Asp.net页面的刷新
  9. 关于批量发布blog的问题
  10. 汇编实验1遇到的问题及解决之记录(以及尚未解决的疑惑,大神可以帮帮看看吗)