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)

思路:此题解法上不算难,可是通过率并不高。仅仅有16.9%。显然在其它地方存在限制。果然第一次提交測试的时候。果断TLE(超时)。代码效率上须要更快的速度。

第一次代码本地測试一组8ms左右。不能过。后面上网參看资料,写出改进的方法,同样的数据,本地測试2ms左右,效率约提高了4倍。

第一种方法代码:

public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
if(nums.length < 2){
return null;
}
//System.out.println(nums);
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<List<Integer>>();
for(int i = 0; i < nums.length - 2; i++){
if(nums[i] > 0)
break; if(i > 1 && nums[i] == nums[i-1]){
continue;
} for(int j = nums.length - 1; j > i + 1; j--){
if(nums[j] < 0)
break; if(j < nums.length -1 && nums[j] == nums[j+1]){
continue;
}
//System.out.println(nums[i]);
int c = -(nums[i] + nums[j]);
int k = search(c,nums,i+1,j-1);
if(k > 0){
List<Integer> al = new ArrayList<Integer>();
al.add(nums[i]);
al.add(nums[k]);
al.add(nums[j]);
list.add(al);
}
}
}
return list;
}
//二分查找数值c的位置,找到返回位置。找不到返回-1
public static int search(int c,int[] nums,int start,int end){
if(c < nums[start] || c > nums[end])
return -1; int k = 0;
while(start <= end){
k = (start + end)/2;
System.out.println(k);
if(c > nums[k]){
start = k + 1;
}else if(c < nums[k]){
end = k - 1;
}
else{
return k;
}
}
return -1;
}
}

另外一种方法代码:

public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(nums.length < 2){
return list;
}
Arrays.sort(nums);//数组排序
int j,k,m;
int len = nums.length;
for(int i = 0; i < len - 2; i++){
//假设最小值依旧大于0或者最大值小于0,肯定没有符合要求的值。直接返回
if(nums[i] > 0 || nums[len-1] < 0)
break;
//假设如今的数字和之前的数字反复,直接跳出,继续下一下
if(i > 0 && nums[i] == nums[i-1]){
continue;
}
//初始值
j = i + 1;
k = len - 1; while(j < k){
m = nums[i] + nums[j] + nums[k];//三者之和
if(m == 0){//=0。满足条件
List<Integer> al = new ArrayList<Integer>();
al.add(nums[i]);
al.add(nums[j]);
al.add(nums[k]);
list.add(al);
j++;
k--;
//假设相邻数字相等。则直接跳过,此处重要
while(j < k && nums[j] == nums[j-1]){
j++;
}
while(j < k && nums[k] == nums[k+1]){
k--;
}
}else{
if(m > 0)//这里也是非常重要的点,分情况位置标记变动
k--;
else
j++;
}
}
}
return list;
}
}

leetCode 15. 3Sum (3数之和) 解题思路和方法的更多相关文章

  1. [LeetCode] 15. 3Sum 三数之和

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  2. [leetcode]15. 3Sum三数之和

    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...

  3. 【LeetCode】15. 3Sum 三数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...

  4. LeetCode :1.两数之和 解题报告及算法优化思路

    最近开始重拾算法,在 LeetCode上刷题.顺便也记录下解题报告以及优化思路. 题目链接:1.两数之和 题意 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 ...

  5. [LeetCode] 15. 3Sum ☆☆☆(3数和为0)

    描述 Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Fi ...

  6. 【LeetCode 15】三数之和

    题目链接 [题解] 先把n个数字升序排个序. 然后枚举三元组最左边的那个数字是第i个数字. 之后用两个指针l,r移动来获取三元组的第2个和第3个数字. (初始值,l=i+1,r = n-1); 如果a ...

  7. leetCode 86.Partition List(分区链表) 解题思路和方法

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  8. leetCode 75.Sort Colors (颜色排序) 解题思路和方法

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  9. leetCode 57.Insert Interval (插入区间) 解题思路和方法

    Insert Interval  Given a set of non-overlapping intervals, insert a new interval into the intervals ...

随机推荐

  1. 顺序栈操作--数据结构(C++)版

    最近学习数据结构,一开始接触感觉好难,颓废了一段时间,后来又重新翻开学习,突然感觉到很大的兴趣.对这些代码的运用都有了 一些新的认识.下面简单的讲述下最新学到的顺序栈,不知道大家学习的时候会不会有感觉 ...

  2. python3正则表达式符号和用法

  3. Appium+python自动化1-环境搭建(上)【转载】

    前言 appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.小编擅长Python,所以接下来的教程是appium+py ...

  4. c语言argc argv

    转载自 http://blog.csdn.net/yukiooy/article/details/4682989 main(int argc,char *argv[ ]) argv为指针的指针 arg ...

  5. 网易 监控 openstack

    http://www.360doc.com/content/16/0416/08/13792507_551022987.shtml

  6. ASP.NET Code First Update-Database

    问题描述: 复制了一个模块化的MVC5的项目,模块化的解释是说不同功能的模块分开来放的. 明确每个模块都是做什么工作的. 首先最基本的,就是根据Apps.Models模块来创建数据库了. 做法是卸载A ...

  7. slice,splice,substr,substring函数的区别

    slice: 语法:array.slice(startIndex,endIndex); 参数: startIndex:必须,规定从何处开始选取,如果为负则从尾部开始计算 : endIndex:可选,规 ...

  8. 51nod 1094 和为k的连续区间【前缀和/区间差/map】

    1094 和为k的连续区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k ...

  9. Jmeter正则表达式提取器--将上一个请求的结果作为下一个请求的参数

    正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用 1.首先在线程组下添加两个HTTP请求, 2.添加好两个HTTP请求后,在每个HTT ...

  10. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...