探讨一下leetcode上的3Sum:

Given an array S of n integers, are there elements abc 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这个问题的地址:

15. 3Sum

3Sum探讨(Java)的更多相关文章

  1. 深入探讨 java.lang.ref 包

    深入探讨 java.lang.ref 包 本文主要探讨了 java.lang.ref 包的使用方法,以及源码解读.并就该包在不同 JVM 上的表现进行了比较与分析.通过阅读本文,读者可以加深对 jav ...

  2. 转载:深入探讨 Java 类加载器

    转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...

  3. 探讨 java 的三大特性之一:继承

    先回顾一下, Java 面向对象的三大特性包括:封装.继承.多态. PS:还有一些说四大特性,加了一个抽象 封装:将属性私有化,对外提供访问属性的方法,也可以不提供方法,这个特性叫做封装. 继承: 子 ...

  4. 深入探讨Java中的异常与错误处理

    Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...

  5. 深入探讨 Java 类加载器

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...

  6. 深入探讨Java类加载机制

    一.前言 毕业至今,已经三年光景,平时基本接触不到关于类加载器的技术(工作上),相信很多同行在开始工作后很长一段时间,对于类的加载机制都没有深入的了解过,之前偶然的机会接触了相关的知识,感觉挺有意思, ...

  7. 深入探讨 java.lang.ref 包--转

    概述 Java.lang.ref 是 Java 类库中比较特殊的一个包,它提供了与 Java 垃圾回收器密切相关的引用类.这些引用类对象可以指向其它对象,但它们不同于一般的引用,因为它们的存在并不防碍 ...

  8. [Leetcode][016] 3Sum Closest (Java)

    题目: https://leetcode.com/problems/3sum-closest/ [标签]Array; Two Pointers [个人分析] 这道题和它的姊妹题 3Sum 非常类似, ...

  9. 深入探讨 Java 类加载器[转]

    原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器(class loader)是 Java™ ...

随机推荐

  1. Divide Sum 比赛时竟然想不出。。。。。。。

    Divide Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...

  2. bzoj1051(明星奶牛)

    这道就是明星奶牛,A了一次又一次了,(⊙o⊙)-(⊙o⊙)- 去年pas就打了不下5次,就是强联通缩点,然后求出度为0的块 判断有多个的话就无解,一个就输出块的大小. #include<cstd ...

  3. Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)D. Felicity's Big Secret Revealed

    题目连接:http://codeforces.com/contest/757/problem/D D. Felicity's Big Secret Revealed time limit per te ...

  4. 关于el-dialog,我更推荐的用法

    最近的项目里用上了vue和element-ui.vue这种轻量级渐进式框架的舒适自不必说,但一直困扰着我的,是如何方便又优雅的弹出模态dialog... 对于我这种在jquery出现之前就用docum ...

  5. day01:study HTTP协议

    总结: 1.对web客户端和web服务器之间的通讯有了基本原理有了简单理解. 2.对http协议有了相关概念的建立 3.B/S C/S 两种形式 4.搭建tomcat服务器的环境,相关配置(虚拟目录 ...

  6. 【JAVA零基础入门系列】Day5 Java中的运算符

    运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...

  7. javascript正则表达式入门

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. k-选取问题

    一.k-选取问题:给定任意一个可比较的序列,从中找出第k个元素(k从0开始,默认是从小到大的次序)的问题称为k-选取(k-selection).k-选取问题有两张退化的情况:1.0-选取问题即是找出序 ...

  9. 干了这杯Java之Vector

    Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vec ...

  10. spring中WebApplicationContextUtils类说明

    WebApplicationContextUtils是一个抽象类,其提供了一个很便利的方法来获取spring应用的上下文即WebApplicationContext. 其中的静态方法getWebApp ...