您的位置:首页 > 编程语言 > Java开发

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;

             
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode