说明

算法:Three Sum
LeetCode地址:https://leetcode.com/problems/3sum/

题目:
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],A solution set is:
[[-1, 0, 1],[-1, -1, 2]
]

解题思路

题意是从数组中找出所有三个和为 0 的元素构成的非重复序列,步骤如下:
1. 把数组先做下排序,
2. 然后遍历这个排序数组,用两个指针分别指向当前元素的下一个为Left和数组尾部Right,然后收紧Left,Right的范围即可,
3. 其中细节操作就是优化和去重。
4. 时间复杂度为for循环里面的运算相加,第一个需要n-3次,最后需要1次,所以就是(n-3) + (n-4) + (n-5) + … + 1 = O(n^2)

代码实现

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> resultList = new ArrayList<List<Integer>>();int sumTarget = 0;int length = nums.length;// 1. delete impossible edge: nums < 3if (length < 3) {return resultList;}// 2. order numsArrays.sort(nums);// 3. delete impossible edge: biggest * 3 < 0if (nums[length - 1] + nums[length - 2] + nums[length -3] < sumTarget) {return resultList;}// 4. delete impossible edge: smallist * 3 > 0if (nums[0] + nums[1] + nums[2] > sumTarget) {return resultList;}// for loopfor (int i = 0; i < length - 2; ) {// smallest > 0, breakif (nums[i] > 0) {break;}// 5. otherwise, smallest + 2 * biggis < 0, smallest ++while (nums[i] + nums[length -1] * 2 < sumTarget && i < length - 2) {i++;}// 6. otherwise, smallest * 2 + biggis > 0, smallest --while (nums[i] * 2 + nums[length - 1] > sumTarget && i < length - 2) {length--;}int left = i + 1;int right = length - 1;//i 与两头缩放while (left < right) {// 7. find the meet target,if (nums[i] + nums[left] + nums[right] == sumTarget) {resultList.add(Arrays.asList(nums[i], nums[left], nums[right]));// then skip while(nums[left] == nums[++left], and left < right)    ,while (nums[left] == nums[++left] && left < right) { }// then skip while(nums[right] == nums[--right], and left < right)while (nums[right] == nums[--right] && left < right) { }} else if (nums[i] + nums[left] + nums[right] < 0) {// 8. else if, nums[left] + nums[left + 1] + nums[right] < 0,// while(nums[left] == nums[++left], and left < right)while (nums[left] == nums[++left] && left < right) { }} else {// 9. else if, nums[i] + nums[left] + nums[right] > 0,// while(nums[right] == nums[--right], and left < right)while (nums[right] == nums[--right] && left < right) { }}}while (nums[i] == nums[++i] && i < length - 2) { }}return resultList;}
}

代码验证

public static void main(String[] args) {Solution object = new Solution();int[] nums = {-1, 0, 1, 2, -1, -4};List<List<Integer>> resultList = object.threeSum(nums);System.out.println("resultList: " + resultList);}

结果输出:

resultList: [[-1, -1, 2], [-1, 0, 1]]

代码执行效率

Success Details
Runtime: 41 ms, faster than 97.15% of Java online submissions for 3Sum.
Memory Usage: 48.5 MB, less than 100.00% of Java online submissions for 3Sum.

总结

Three sum实为考察对数组的排序,对指针的收紧移动。

代码下载:
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/ThreeSum.java

算法:Three sum求三个数之和相关推荐

  1. 【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】

    [015-3 Sum(三个数的和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an array S of n integers, are there ...

  2. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  3. Java求三个数的最小公倍数算法改进(化境)

    之前在<Java求3个数的最小公倍数LCM,要求LCM小于11亿时计算结果正确(在CPU性能小于1.8GHz的情况下)>一文中"避免了之前的算法最大计算量的情况"(相对 ...

  4. 计算机语言平均数怎么算,使用python怎么求三个数的平均值

    使用python怎么求三个数的平均值 发布时间:2021-04-27 17:31:39 来源:亿速云 阅读:64 作者:Leah 本篇文章给大家分享的是有关使用python怎么求三个数的平均值,小编觉 ...

  5. 求三个数的最小公倍数的解法之美

    从键盘上输入三个数,求其最小公倍数. 分析:最小公倍数是指能整除这三个数的公倍数中的最小者,可以利用循环穷举的方法,看是否能整除这三个数.若能整除这三个数,则输出其中的最小的数即为最小公倍数. 第一种 ...

  6. 数组-leetcode#15-找出三个数之和等于0的所有不重复序列

    class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vecto ...

  7. python求三个数平均值_python求三个数平均值

    本文收集整理关于python求三个数平均值的相关议题,使用内容导航快速到达. 内容导航: Q1:利用python3.x计算任意数据平均值 l=[1,2,3]def ave(a):print(sum(a ...

  8. 求三个数的最大公约数和最小公倍数

    题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整数最大公约数 ...

  9. python函数编程求三个数的最小公倍数_Python求三个数的最小公倍数

    题目 求三个数的最小公倍数 思路 首先求两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数就是最终结果 有两种方案求两个数的最小公倍数 1. 分解质因数,也是短除法(在程序上差别不大) 循环 ...

  10. 剑指offer之求两个数之和(不能使用四则运算)

    1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;in ...

最新文章

  1. android studio离线配置gradle插件_Gradle 扫盲与 Task 基础
  2. python sftp传输文件总是报文件不存在_Paramiko:通过SFTP传输文件时,windows文件路径出错...
  3. Java中实现六种图像处理的效果(灰度化、马赛克效果、去背景实现、珠纹化实现、黑白版画效果、油画效果)
  4. Jmeter自定义函数和引入外部文件的几种方法
  5. Paper:《Generating Sequences With Recurrent Neural Networks》的翻译和解读
  6. Padding Oracle Attack填充提示攻击-渗透测试
  7. mysql从字符串中取子字符串_如何从开始于MySQL中特定位置的字符串中提取子字符串?...
  8. MyBatisPlus分页
  9. 计算机网络选择重传,计算机网络选择重传协议实验报告..docx
  10. 第九节:JWT简介和以JS+WebApi为例基于JWT的安全校验
  11. 图灵,蔡汀,达尔文:计算中的上帝
  12. 在centos上运行neural_artistic_style 风格转换
  13. Windows95 程序设计指南(Windows 95 A Developer's Guside)
  14. 第九节 html特殊文字符号
  15. python查询mysql decimal报错_【2020Python修炼记】MySQL之 表相关操作
  16. 倚天鸿蒙系统,倚天屠龙记强化系统详解
  17. 技术分享 | 排序(filesort)详细解析(8000 字长文)
  18. matlab dbns实现,深度置信网DBNs的源码
  19. docker打jdk 1.8镜像
  20. web应用票据打印实现(四)

热门文章

  1. windows安装python3步骤_windows下python3第三方库安装方法总结
  2. 每周个人进度总结06
  3. CentOS 快速安装ftp
  4. 使用Junit对Android应用进行单元测试
  5. Centos下Nagios的安装与配置
  6. “.NET研究”理解.NET程序集的执行过程
  7. 关于nagios监控系统添加主机和服务脚本
  8. 时代杂志评选了08年50个最棒的网站
  9. 报错Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.liuyanzhao.b
  10. 深职院c语言考试试卷,深职院第1章C语言基础与入门教学.ppt