首页 > 代码库 > 3Sum
3Sum
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:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- 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)
最开始想着直接用穷举法,三重循环,时间复杂度O(N^3)略高,TLE超时,提示说用双指针,百度之,看到http://blog.csdn.net/xiaobaohe/article/details/7857461
用的是穷举法,不过优化了一下,先讲数组排序,然后去重,效率高了一点,600ms左右,java做的
后面百度看双指针如何求解
1 package com.gxf.test; 2 3 4 import java.util.ArrayList; 5 import java.util.Arrays; 6 import java.util.HashMap; 7 8 import java.util.List; 9 10 11 //class ListNode {12 // public int val;13 // public ListNode next;14 // ListNode(int x) {15 // val = x;16 // next = null;17 // }18 // }19 20 public class Solution {21 public List<List<Integer>> threeSum(int[] num) {22 List<List<Integer>> result = new ArrayList<List<Integer>>();23 HashMap<String, Integer> map = new HashMap<String, Integer>();24 Arrays.sort(num);25 // for(int i = 0; i < num.length; i++){26 // System.out.print(num[i] + " ");27 // }28 // System.out.println();29 30 for(int i = 0; i < num.length - 2; i++){31 if(num[i] > 0)32 break;33 if(i > 0 && num[i] == num[i - 1])34 continue; //去重35 for(int j = i + 1; j < num.length - 1; j++){36 if(j > i + 1 && num[j] == num[j - 1])37 continue; //去重38 for(int k = j + 1; k < num.length; k++){39 if(k > j + 1 && num[k] == num[k - 1])40 continue; //去重41 if(num[i] + num[j] + num[k] == 0){42 List<Integer> element = new ArrayList<Integer>();43 44 element.add(num[i]);45 element.add(num[j]);46 element.add(num[k]);47 48 result.add(element);49 }50 }51 }52 }53 54 55 return result;56 }57 }
下面是用双指针做的,时间复杂度好像为O(n*logn)
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.HashMap; 4 5 import java.util.List; 6 7 8 //class ListNode { 9 // public int val;10 // public ListNode next;11 // ListNode(int x) {12 // val = x;13 // next = null;14 // }15 // }16 17 public class Solution {18 public List<List<Integer>> threeSum(int[] num) {19 List<List<Integer>> result = new ArrayList<List<Integer>>();20 Arrays.sort(num); //将数组升序排序21 22 for(int i = 0; i < num.length; i++){23 if(i > 0 && num[i] == num[i - 1])24 continue; //去重25 int j = i + 1;26 int k = num.length - 1;27 while(j < k){ //从i + 1 ~ n - 1中找出两个数等于-num[i]28 if(j > i + 1 && num[j] == num[j - 1])29 {30 j++;31 continue;32 }33 if(k < num.length - 1 && num[k] == num[k + 1]){34 k--;35 continue;36 } //去重37 int temp = num[i] + num[j] + num[k];38 if(temp > 0){ //结果比0大k前移39 k--;40 continue;41 }42 else if(temp < 0){43 j++;44 continue;45 }else{ //找到一个解46 List<Integer> element = new ArrayList<Integer>();47 element.add(num[i]);48 element.add(num[j]);49 element.add(num[k]);50 result.add(element);51 j++;52 //break; //退出循环53 }54 55 }56 }57 58 return result;59 }60 }
参考:http://www.cnblogs.com/lihaozy/archive/2013/01/23/2872427.html
3Sum
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。