算法:Three sum求三个数之和
说明
算法: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求三个数之和相关推荐
- 【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】
[015-3 Sum(三个数的和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an array S of n integers, are there ...
- 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数
第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...
- Java求三个数的最小公倍数算法改进(化境)
之前在<Java求3个数的最小公倍数LCM,要求LCM小于11亿时计算结果正确(在CPU性能小于1.8GHz的情况下)>一文中"避免了之前的算法最大计算量的情况"(相对 ...
- 计算机语言平均数怎么算,使用python怎么求三个数的平均值
使用python怎么求三个数的平均值 发布时间:2021-04-27 17:31:39 来源:亿速云 阅读:64 作者:Leah 本篇文章给大家分享的是有关使用python怎么求三个数的平均值,小编觉 ...
- 求三个数的最小公倍数的解法之美
从键盘上输入三个数,求其最小公倍数. 分析:最小公倍数是指能整除这三个数的公倍数中的最小者,可以利用循环穷举的方法,看是否能整除这三个数.若能整除这三个数,则输出其中的最小的数即为最小公倍数. 第一种 ...
- 数组-leetcode#15-找出三个数之和等于0的所有不重复序列
class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vecto ...
- python求三个数平均值_python求三个数平均值
本文收集整理关于python求三个数平均值的相关议题,使用内容导航快速到达. 内容导航: Q1:利用python3.x计算任意数据平均值 l=[1,2,3]def ave(a):print(sum(a ...
- 求三个数的最大公约数和最小公倍数
题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整数最大公约数 ...
- python函数编程求三个数的最小公倍数_Python求三个数的最小公倍数
题目 求三个数的最小公倍数 思路 首先求两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数就是最终结果 有两种方案求两个数的最小公倍数 1. 分解质因数,也是短除法(在程序上差别不大) 循环 ...
- 剑指offer之求两个数之和(不能使用四则运算)
1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;in ...
最新文章
- android studio离线配置gradle插件_Gradle 扫盲与 Task 基础
- python sftp传输文件总是报文件不存在_Paramiko:通过SFTP传输文件时,windows文件路径出错...
- Java中实现六种图像处理的效果(灰度化、马赛克效果、去背景实现、珠纹化实现、黑白版画效果、油画效果)
- Jmeter自定义函数和引入外部文件的几种方法
- Paper:《Generating Sequences With Recurrent Neural Networks》的翻译和解读
- Padding Oracle Attack填充提示攻击-渗透测试
- mysql从字符串中取子字符串_如何从开始于MySQL中特定位置的字符串中提取子字符串?...
- MyBatisPlus分页
- 计算机网络选择重传,计算机网络选择重传协议实验报告..docx
- 第九节:JWT简介和以JS+WebApi为例基于JWT的安全校验
- 图灵,蔡汀,达尔文:计算中的上帝
- 在centos上运行neural_artistic_style 风格转换
- Windows95 程序设计指南(Windows 95 A Developer's Guside)
- 第九节 html特殊文字符号
- python查询mysql decimal报错_【2020Python修炼记】MySQL之 表相关操作
- 倚天鸿蒙系统,倚天屠龙记强化系统详解
- 技术分享 | 排序(filesort)详细解析(8000 字长文)
- matlab dbns实现,深度置信网DBNs的源码
- docker打jdk 1.8镜像
- web应用票据打印实现(四)
热门文章
- windows安装python3步骤_windows下python3第三方库安装方法总结
- 每周个人进度总结06
- CentOS 快速安装ftp
- 使用Junit对Android应用进行单元测试
- Centos下Nagios的安装与配置
- “.NET研究”理解.NET程序集的执行过程
- 关于nagios监控系统添加主机和服务脚本
- 时代杂志评选了08年50个最棒的网站
- 报错Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.liuyanzhao.b
- 深职院c语言考试试卷,深职院第1章C语言基础与入门教学.ppt