3sum leetcode
2015-12-11 19:38
351 查看
leetcode but time limit
/*
* 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)
*
*
*/
问题解决方案:
1 首先排序
2 设置两个指针,一个是头指针,一个是为指针
3 时间是0(n^2)
public class sum3 {
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3) return result;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
int m=i+1,n=nums.length-1;
while(m<n)
{
List<Integer> temp=new ArrayList<Integer>();
if(nums[i]+nums[m]+nums
>0){
n--;
}else if(nums[i]+nums[m]+nums
<0){
m++;
}else{
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums
);
if(!result.contains(temp)){
result.add(temp);
}
m++;n--;
}
}
}
return result;
}
更改一些条件,减少循环次数,能够有效的加快时间
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3) return result;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
int m=i+1,n=nums.length-1;
int sum=-nums[i];
while(m<n)
{
List<Integer> temp=new ArrayList<Integer>();
if(nums[m]+nums
==sum){
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums
);
if(!result.contains(temp)){
result.add(temp);
}
while(m<n&&nums[m]==nums[m+1]) m++;
while(m<n&&nums
==nums[n-1]) n--;
m++;n--;
}else if(nums[m]+nums
<sum){
while(m<n&&nums[m]==nums[m+1]) m++;
m++;
}else{
while(m<n&&nums
==nums[n-1]) n--;
n--;
}
}
}
return result;
}
经过过滤或者添加附加条件会让时间更短
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3) return result;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
int m=i+1,n=nums.length-1;
int sum=-nums[i];
while(m<n)
{
List<Integer> temp=new ArrayList<Integer>();
if(nums[m]+nums
==sum){
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums
);
result.add(temp);
while(m<n&&nums[m]==nums[m+1]) m++;
while(m<n&&nums
==nums[n-1]) n--;
m++;n--;
}else if(nums[m]+nums
<sum){
while(m<n&&nums[m]==nums[m+1]) m++;
m++;
}else{
while(m<n&&nums
==nums[n-1]) n--;
n--;
}
}
}
}
return result;
}
/*
* 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)
*
*
*/
问题解决方案:
1 首先排序
2 设置两个指针,一个是头指针,一个是为指针
3 时间是0(n^2)
public class sum3 {
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3) return result;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
int m=i+1,n=nums.length-1;
while(m<n)
{
List<Integer> temp=new ArrayList<Integer>();
if(nums[i]+nums[m]+nums
>0){
n--;
}else if(nums[i]+nums[m]+nums
<0){
m++;
}else{
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums
);
if(!result.contains(temp)){
result.add(temp);
}
m++;n--;
}
}
}
return result;
}
更改一些条件,减少循环次数,能够有效的加快时间
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3) return result;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
int m=i+1,n=nums.length-1;
int sum=-nums[i];
while(m<n)
{
List<Integer> temp=new ArrayList<Integer>();
if(nums[m]+nums
==sum){
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums
);
if(!result.contains(temp)){
result.add(temp);
}
while(m<n&&nums[m]==nums[m+1]) m++;
while(m<n&&nums
==nums[n-1]) n--;
m++;n--;
}else if(nums[m]+nums
<sum){
while(m<n&&nums[m]==nums[m+1]) m++;
m++;
}else{
while(m<n&&nums
==nums[n-1]) n--;
n--;
}
}
}
return result;
}
经过过滤或者添加附加条件会让时间更短
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums.length<3) return result;
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
int m=i+1,n=nums.length-1;
int sum=-nums[i];
while(m<n)
{
List<Integer> temp=new ArrayList<Integer>();
if(nums[m]+nums
==sum){
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums
);
result.add(temp);
while(m<n&&nums[m]==nums[m+1]) m++;
while(m<n&&nums
==nums[n-1]) n--;
m++;n--;
}else if(nums[m]+nums
<sum){
while(m<n&&nums[m]==nums[m+1]) m++;
m++;
}else{
while(m<n&&nums
==nums[n-1]) n--;
n--;
}
}
}
}
return result;
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统