3Sum探讨(Java)
探讨一下leetcode上的3Sum:
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]
] 1.暴力解法
时间复杂度高达O(n^3)
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists =new ArrayList<List<Integer>>();
for(int i=0;i<nums.length-2;i++) {
for (int j = i + 1; j < nums.length-1; j++) {
for(int z=j+1;z<nums.length;z++){
if(nums[i]+nums[j]+nums[z]==0){
List<Integer> list =new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[z]);
lists.add(list);
}
}
}
}
return lists;
}
运行结果:

结果不尽人意,有个重复的。我想过如果使用list排重的话。必然先要对list进行排序,然后对比是否相等,如果相等,再剔除掉一样的。代码如下:
public static List<List<Integer>> three(int[] nums){
List<List<Integer>> lists =new ArrayList<List<Integer>>();
for(int i=0;i<nums.length-2;i++) {
for (int j = i + 1; j < nums.length-1; j++) {
for(int z=j+1;z<nums.length;z++){
if(nums[i]+nums[j]+nums[z]==0){
List<Integer> list =new ArrayList<Integer>();
boolean flag = true;
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[z]);
Collections.sort(list);
for(int k=0;i<lists.size();i++){
if(list.equals(lists.get(i))){
flag = false;
}
}
if(flag){
lists.add(list);
}
}
}
}
}
return lists;
}
运行结果:

看着貌似问题解决了,但是Runtime=2ms,时间有点长,时间复杂度太高了。
上交的时候爆出来一个错误:

既然结果都能运行出来,为什么还爆数组越界呢?我也看不出来什么毛病。
2.使用map
时间复杂度为O(n+n^2),即O(n^2)
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists =new ArrayList<List<Integer>>();
Map<Integer,Integer> map =new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
map.put(num[i],i);
}
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++) {
int res=0-nums[i]-nums[j];
if(map.containsKey(res)&&map.get(res)!=i&&map.get(res)!=j){
List<Integer> list =new ArrayList<Integer>();
list.add(res);
list.add(nums[i]);
list.add(nums[j]);
lists.add(list);
}
}
}
return lists;
}
这个的运行结果让人头疼。

有没有好的办法可以排重,如果这样的话,时间复杂度是O(n^2):
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> lists =new ArrayList<List<Integer>>();
Map<Integer,Integer> map =new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++) {
int res=0-nums[i]-nums[j];
if(map.containsKey(res)){
List<Integer> list =new ArrayList<Integer>();
list.add(res);
list.add(nums[i]);
list.add(nums[j]);
lists.add(list);
}
}
map.put(nums[i],i);
}
return lists;
}
运行结果:

这下结果正确了,提交一下:

对于上面的数组,算法是不成立的。我把上面的list排重写进里面,但是就是解决不了问题。请高手帮我解决问题,共同学习。
附上leetcode这个问题的地址:
3Sum探讨(Java)的更多相关文章
- 深入探讨 java.lang.ref 包
深入探讨 java.lang.ref 包 本文主要探讨了 java.lang.ref 包的使用方法,以及源码解读.并就该包在不同 JVM 上的表现进行了比较与分析.通过阅读本文,读者可以加深对 jav ...
- 转载:深入探讨 Java 类加载器
转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...
- 探讨 java 的三大特性之一:继承
先回顾一下, Java 面向对象的三大特性包括:封装.继承.多态. PS:还有一些说四大特性,加了一个抽象 封装:将属性私有化,对外提供访问属性的方法,也可以不提供方法,这个特性叫做封装. 继承: 子 ...
- 深入探讨Java中的异常与错误处理
Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...
- 深入探讨 Java 类加载器
转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...
- 深入探讨Java类加载机制
一.前言 毕业至今,已经三年光景,平时基本接触不到关于类加载器的技术(工作上),相信很多同行在开始工作后很长一段时间,对于类的加载机制都没有深入的了解过,之前偶然的机会接触了相关的知识,感觉挺有意思, ...
- 深入探讨 java.lang.ref 包--转
概述 Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 ...
- [Leetcode][016] 3Sum Closest (Java)
题目: https://leetcode.com/problems/3sum-closest/ [标签]Array; Two Pointers [个人分析] 这道题和它的姊妹题 3Sum 非常类似, ...
- 深入探讨 Java 类加载器[转]
原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器(class loader)是 Java™ ...
随机推荐
- ThinkPHP5高阶实战教程
tp5项目:https://www.kancloud.cn/mikkle/thinkphp5_study/396283
- Milk Patterns poj3261(后缀数组)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9274 Accepted: 4173 Cas ...
- 自测-5 Shuffling Machine
Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techn ...
- java基础知识及详细笔记
第一章:初识java 1.1.java的概述 ü 什么是计算机程序:计算机按照某种顺序而完成的一系列有序指令的集合. ü Java的作用:1:安装和运行本机上的桌面程序.2:通过浏览器访问面向in ...
- 创建文件DSN
记录:为了将access中表格直接上传到SQL中,不用在SQL中进行再创建. 优点:不用经过系统来生成,直接手动产生.(主要是搜索到的资料不足以一下搞出来,抱着试试的心态,最后成功了!) 操作步骤: ...
- 我真的知道JavaScript吗?
JavaScript 说说JavaScript 接触JavaScript时间其实已经不短了,之前一直是半瓶酱油,东凑西凑的收集相关的知识.并没有完整系统的学习过JavaScript,觉得JavaScr ...
- javascript字典数据结构Dictionary实现
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- 胡小兔的OI日志3 完结版
胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...
- 2017年十大奇葩画风的H5页面案例,原来脑洞可以这样大
每个人都是视觉动物,画面精美.体验奇特的H5,用户在内心一般都会满分打出,毫不吝啬,同时也毫不犹豫分享,因为此时的分享不掉价儿~ 今天给大家准备了十支H5,画风超级奇特,非常值得一看所有案例均可在19 ...
- win10 uwp 自定义控件初始化
我遇到一个问题,我在 xaml 用了我的自定义控件,但是我给他设置了一个值,但是什么时候我才可以获得这个值? 本文告诉大家,从构造函数.loaded.Initialized 的调用过程. 用最简单的方 ...