3sum(从数组中找出三个数的和为0)
Given an array S of n integers, are there elements a, b, c in S 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.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
从上面可以看出,这样的结果可能出现多个。而且还有重复数字出现。。
我们知道求两个数的和,可以先排序,然后两端向中间找,如果求下标,则用hashmap。
这里不是求下标,所以不需要使用hashmap。
思路就是:先排序,然后遍历数组,当前元素nums[i],,并从剩下的数组中找两个数的和0-nums[i],这个做法就是两边向中间找。需要注意,排序过后会有重复元素,在外层遍历的时候,我们要跳过重复元素(当前元素 和前一个相同)。在内部遍历查找两个数的和时,也要跳过重复元素(如果当前符合要求的值刚好是重复的,就跳过那些重复的,只要计算一遍就行)。具体的跳过重复的步骤见代码。。
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums==null||nums.length<3) return result;
Arrays.sort(nums);
List<Integer> list;
for(int i=0;i<nums.length-2;i++){
//跳过重复的,这个跟前一个不一样就进行
if(i==0||(i>0&&nums[i]!=nums[i-1])){
//开始从剩下的数组中查找和为0-nums[i]的两个数,而且是要遍历完剩下所有元素,因为可能存在多组
int left=i+1,right=nums.length-1,sum=0-nums[i];
while(left<right){
if(nums[left]+nums[right]==sum){
//找到一组了,加到集合中
list=new ArrayList<>();
list.add(nums[i]);list.add(nums[left]);list.add(nums[right]);
result.add(list);
//跳过重复元素。这里跳到了重复节点的最后一个,也就是说还需要在++
while(left<right&&nums[left+1]==nums[left]) left++;
while(left<right&&nums[right]==nums[right-1]) right--;
left++;right--;
}else if(nums[left]+nums[right]<sum){
left++;
}else right--;
}
}
}
return result;
}
3sum(从数组中找出三个数的和为0)的更多相关文章
- C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。
//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...
- 从1~N中任选出三个数,最小公倍数最大
已知一个正整数N,问从1~N中任选出三个数,它们的最小公倍数最大可以为多少. 当n为奇数:n.n-1.n-2这是三个最大数,并且它们两两互质.因为连续的奇.偶.奇,互质.连续的两个数互质是因为它们的公 ...
- 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比
算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} 要找出那些数相加等 ...
- Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)
题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...
- 从数组中找出所有组合为s的数
java版本 package numCombine; /** * 从数组中找出所有组合为s的数 * @author root * */ public class NumComberAll { publ ...
- 数组中找出最小的K个数
题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...
- Leetcode34--->Search for a Range(在排序数组中找出给定值出现的范围)
题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, ...
随机推荐
- 在Android中使用AlarmManager
AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent.而使用Intent的时候,我们还需要它执行一个动作,如startActivity, ...
- Java虚拟机定义
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的 ...
- Postgre: How to import UUID function into Postgre 9.3
1. Open a command console and go to the directory where you installed Postgre server. e.g. D:\Progra ...
- 批量替换数据库中所有用户数据表中字段数据类型为char和varchar到nvarchar的脚本
解决问题:字段类型为char的总是占用指定字节长度(末尾好多空白符号),varchar数据类型长度一个汉字占2个字节,内容存储为中文的字段个人建议全部使用nvarchar. 操作说明:打开SQL Se ...
- 【一天一道LeetCode】#74. Search a 2D Matrix
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...
- java程序的加载过程
昨天笔试阿里有个求java程序加载过程的题目很是复杂,回来研究了好久才有点明白,整理一下.原题代码如下,判断输出: public class StaticTest { public static in ...
- HTML入门笔记案例展示(1)
一: html标签&html书写规则 Html 的标签 分为如下 这两种 : 单标签: 单标签一般 用于特殊的含义, 例如 : <br/> 表示换行, <hr/> ...
- (NO.00001)iOS游戏SpeedBoy Lite成形记(五)
在GameScene.m中添加matchRun的实现: -(void)matchRun{ CCLOG(@"%@ invoke!",NSStringFromSelector(_cmd ...
- View,ViewGroup的Touch事件的分发机制
原帖地址:http://blog.csdn.net/xiaanming/article/details/21696315 ViewGroup的事件分发机制 我们用手指去触摸Android手机屏幕,就会 ...
- [面试算法题]比较二叉树异同-leetcode学习之旅(5)
问题描述 Given two binary trees, write a function to check if they are equal or not. Two binary trees ar ...