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[n]>0){
n--;
}else if(nums[i]+nums[m]+nums[n]<0){
m++;
}else{
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums[n]);
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[n]==sum){
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums[n]);
if(!result.contains(temp)){
result.add(temp);
}
while(m<n&&nums[m]==nums[m+1]) m++;
while(m<n&&nums[n]==nums[n-1]) n--;
m++;n--;
}else if(nums[m]+nums[n]<sum){
while(m<n&&nums[m]==nums[m+1]) m++;
m++;
}else{
while(m<n&&nums[n]==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[n]==sum){
temp.add(nums[i]);
temp.add(nums[m]);
temp.add(nums[n]);
result.add(temp);
while(m<n&&nums[m]==nums[m+1]) m++;
while(m<n&&nums[n]==nums[n-1]) n--;
m++;n--;
}else if(nums[m]+nums[n]<sum){
while(m<n&&nums[m]==nums[m+1]) m++;
m++;
}else{
while(m<n&&nums[n]==nums[n-1]) n--;
n--;
}
}
}
}
return result;
}