探讨一下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. PHP和JS判断变量是否定义

    PHP中: 通过isset(变量名)来判断,定义返回true/未定义返回false JS中: 通过typeof来判断.

  2. Ansible(三) - playbook简介

    Ⅰ. Playbook介绍 Playbook其实就是ansible的一个任务列表,各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个.在顺序运行某playb ...

  3. 高德地图测两点距离android比较精确的

    /////参考资料:高德官方:[http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation] 主要三 ...

  4. git fsck -- 一致性检查

    格式:           git fsck  [选项] <path> 选项 git commit -a 提交所有改动的文件(a -- all) git commit -m 提交说明(m ...

  5. 从 JavaScript 到 TypeScript 系列

    随着应用的庞大,项目中 JavaScript 的代码也会越来越臃肿,这时候许多 JavaScript 的语言弊端就会愈发明显,而 TypeScript 的出现,就是着力于解决 JavaScript 语 ...

  6. angualrJs清除定时器

    angualrJs清除定时器爬坑之路: 今天发现一个奇怪问题,放在自定义指令里边的定时器竟然在页面跳转之后,在另一个页面这个循环定时器还在执行,这肯定是不行的,会影响系统的性能. 我在angular里 ...

  7. 【转】python time模块详解

    python 的内嵌time模板翻译及说明  一.简介 time模块提供各种操作时间的函数  说明:一般有两种表示时间的方式:       第一种是时间戳的方式(相对于1970.1.1 00:00:0 ...

  8. Python 基础之函数、深浅copy,set及练习

    三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...

  9. 如何将解压版的tomcat设置为windows 服务启动

    在web服务器上通常需要是web容器随开机自动启动,恰好Tomcat可以作为服务启动,只要经过我们简单的配置,就可以将免安装版的Tomcat添加到系统服务中. 首先需要配置以下环境变量: JAVA_H ...

  10. GooglePlay - 排行榜及支付接入

    前言 Google Play应用商店在国外Android市场中地位基本与AppStore在IOS中的地位一致,为此考虑国外的应用时,Android首要考虑的是接入GooglePlay的排行榜等支持. ...