leetCode 15. 3Sum (3数之和) 解题思路和方法
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数之和) 解题思路和方法的更多相关文章
- [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 ...
- [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 ...
- 【LeetCode】15. 3Sum 三数之和
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...
- LeetCode :1.两数之和 解题报告及算法优化思路
最近开始重拾算法,在 LeetCode上刷题.顺便也记录下解题报告以及优化思路. 题目链接:1.两数之和 题意 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 ...
- [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 ...
- 【LeetCode 15】三数之和
题目链接 [题解] 先把n个数字升序排个序. 然后枚举三元组最左边的那个数字是第i个数字. 之后用两个指针l,r移动来获取三元组的第2个和第3个数字. (初始值,l=i+1,r = n-1); 如果a ...
- 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 ...
- leetCode 75.Sort Colors (颜色排序) 解题思路和方法
Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...
- leetCode 57.Insert Interval (插入区间) 解题思路和方法
Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ...
随机推荐
- Centos7部署Open-Falcon监控
参考博主:努力哥完成 一.Open-Falcon介绍 1.监控系统,可以从运营级别(基本配置即可),以及应用级别(二次开发,通过端口进行日志上报),对服务器.操作系统.中间件.应用进行全面的监控,及报 ...
- hdu 1598(最小生成树)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- C#模拟进行压力测试
using System; using System.Diagnostics; using System.IO; using System.Net; using System.Text; using ...
- 【转】玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo
http://blog.csdn.net/yanzi1225627/article/details/33339965 GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而 ...
- SQL Server 预编译执行SQLs
问题描述: MVC5项目,利用执行sql的方式获取数据,但是在利用预编译执行的时候报错了,字段XXXwhich was not supplied. 其实就是这个参数传了个null导致的.在传参数之前做 ...
- 牛客网 牛客练习赛7 A.骰子的游戏
A.骰⼦的游戏 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 在Alice和Bob面前的是两个骰 ...
- 前端常用面试题目及答案-HTML&CSS篇
1. 行内元素和块级元素有哪些? 行内元素: 123456789101112131415161718192021222324252627 <a> //标签可定义锚 <ab ...
- 洛谷 U19159 采摘毒瘤
题目背景 Salamander见到路边有如此多的毒瘤,于是见猎心喜,从家里拿来了一个大袋子,准备将一些毒瘤带回家. 题目描述 路边共有nn 种不同的毒瘤,第i 种毒瘤有k_i 个,每个需要占据d_i ...
- The Art of Mocking
One of the challenges developers face when writing unit tests is how to handle external dependencies ...
- (转载)EF 使用code first模式创建数据库和 填充种子数据
第一篇:来自 .net 开发菜鸟 博主的文章:https://www.cnblogs.com/dotnet261010/p/8035213.html 第二篇:来自 JustYong 博主的文章:htt ...