探讨一下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. P1013

    问题 D: P1013 时间限制: 1 Sec  内存限制: 128 MB提交: 33  解决: 21[提交][状态][讨论版] 题目描述 " 找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手 ...

  2. 模型组合(Model Combining)之Boosting与Gradient Boosting

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  3. Detect Capital

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...

  4. H264 NAL解析

    NAL全称Network Abstract Layer,即网络抽象层.在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL).其中,前者负责有 ...

  5. FPGA IN 消费电子

    消费电子: 消费电子(Consumer electronics),指供日常消费者生活使用的电子产品.消费类电子产品是指用于个人和家庭与广播.电视有关的音频和视频产品,主要包括:电视机.影碟机(VCD. ...

  6. WPF DataGrid自动生成行号

      在使用WPF进行应用程序的开发时,经常会为DataGrid生成行号,这里主要介绍一下生成行号的方法.通常有三种方法,这里主要介绍其中的两种,另一种简单提一下. 1. 直接在LoadingRow事件 ...

  7. OC实现同步访问属性

    有时候,我们在开发过程中需要对属性的访问进行同步操作,这种属性需要做成原子的,用atomic来修饰属性,即可实现这一点. 如果我们想自己实现,可以按照下面方式写代码: SFPerson.h #impo ...

  8. iOS 11 & iPhone X 适配资料集

    本文主要简单谈谈并收集一些关于 iOS 11 & iPhone X 的适配及设计指南. iPhone X 众所周知,iPhone X 屏幕与其他的 iPhone 设备均不同,苹果称 iPhon ...

  9. Ubuntu使用Windows下的conio.h

    把虚线框里面的内容粘贴进文档文本里面 --------------------------------------------------------------------------------- ...

  10. 浅谈前后端分离与实践 之 nodejs 中间层服务(二)

    一.背景 书接上文,浅谈前后端分离与实践(一) 我们用mock服务器搭建起来了自己的前端数据模拟服务,前后端开发过程中只需定义好接口规范,便可以相互进行各自的开发任务.联调的时候,按照之前定义的开发规 ...