探讨一下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. 用MXNet实现mnist的生成对抗网络(GAN)

    用MXNet实现mnist的生成对抗网络(GAN) 生成式对抗网络(Generative Adversarial Network,简称GAN)由一个生成网络与一个判别网络组成.生成网络从潜在空间(la ...

  2. 虚拟机+桥接模式+Host-only模式 搭建完美的Windows下Linux开发环境

    相信有很多鞋童和我一个样是一枚Linux码农(我现在还是嵌入式方向). 做Linux开发势必需要一个Linux环境, 大多数开发者会首先选择一个Linux发行版, 其中Ubuntu LTS版本应该是选 ...

  3. FastDFS分布式文件系统

    FastDFS分布式文件系统 阅读目录 相关文章 1 分布式文件系统介绍 2 系统架构介绍 3 FastDFS性能方案 4 Linux基本命令操作 5 安装VirtualBox虚拟机并配置Ubuntu ...

  4. JS获取fileupload文件全路径

    来自:http://hi.baidu.com/libos88/item/c61ab8bae472afe34ec7fdfb 最近在写个小网站,用到了fileupload控件来上传文件.因为程序的某些需要 ...

  5. js 查询 添加 删除 练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. Linux入门(12)——解决双系统下Ubuntu16.04不能访问Windows分区

    解决办法一: 进入windows系统,关闭快速启动,关机. 解决办法二: 如果办法一不能解决问题,用这个办法. 查看盘符: sudo fdisk -l 需要在查看盘符后记下目标盘符的数字,比如想解除C ...

  7. 第一篇bolg

    仅以此篇谨记自己,以后加油

  8. MySql采用GROUP_CONCAT合并多条数据显示的方法

    情况分析: 1. 表course id     name 1      课程一 ================= 2.表course_teacher id   course_id  teacher_ ...

  9. 大道至简第一章读后感Java伪代码

    //一.愚公移山 /*原始需求 惩山北直塞,出入之迁也. 项目沟通的方式 聚室而谋 项目目标 毕力平险,指通豫南,达于汉阴 人员组成 愚公,子孙荷担者三夫,邻人遗男 技术方案 叩石垦壤 簸萁运与渤海之 ...

  10. celery rabbit mq 详解

    Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...