首页 > 代码库 > LeetCode:3Sum

LeetCode: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, abc)
  • 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)
 
首先,先把数组排序这样能提高查找的效率。在这里,使用快速排序。其实有3个指针,第一个指针i固定往右移动。另外两个当第一个指针固定时,start指向第一个指针右边一个,end指向结尾,开始查找另外两个值。当*start+*end>-*i,end向左移动一位,小于的时候,start向右移动一位,等于的时候添加到结果中。直到start=end停止。
在其实忽略了一个问题,就是有相同的答案我们还是会添加进去。这里使用一个String content,把添加到结果的排列以字符方式添加到content中,添加前要判断content是否包含,如果包含了就跳过。
还有一个就是可以节约时间的是当i指针值大于0了说明所有值都大于0,则停止返回。还有个是,当下一个i与前一个指针值相同时,就跳到下一个。不要做重复的动作。

public class Solution {
         public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
       
        ArrayList<ArrayList<Integer>> sum = new ArrayList<ArrayList<Integer>>();
        int length = num.length;
        if(length < 3)return sum;
        sort(num,0,length-1);
        String content = "";
        for(int i=0;i<length-2;i++)
        {
            int value = http://www.mamicode.com/num[i];
            if(value>0)
            {
                break;
            }
            else if(i>0&&num[i] == num[i-1])
            {}
            else
            {
                value = http://www.mamicode.com/-value;
                int start = i+1;
                int end = length -1;
                while(start<end)
                {
                    if(num[start]+num[end]==value)
                    {
                        if(i>0&&num[i] == num[i-1])
                        {
                            start++;
                        }
                        else
                        {
                            String temp = "" + num[i] +"," + num[start] + "," + num[end] + ",";
                            if(!content.contains(temp))
                            {
                                ArrayList<Integer> zero = new ArrayList<Integer>();
                                zero.add(num[i]);
                                zero.add(num[start]);
                                zero.add(num[end]);
                                sum.add(zero);
                                content = content + temp;
                            }
                            start++;
                        }
                       
                    }
                    else if(num[start]+num[end]>value)
                    {
                        end--;
                    }
                    else if(num[start]+num[end]<value)
                    {
                        start++;
                    }
                }
            }
        }
        return sum;
       
    }
    public void sort(int[] num,int start,int end)
    {
        if(start<end)
        {
            int p = partition(num,start,end);
            sort(num,start,p-1);
            sort(num,p+1,end);
        }
       
    }
    public int partition(int[] num,int start,int end)
    {
        if(end - start==0)return start;
        int key = num[start];
        while(start<end)
        {
            while(end>start&&num[end]>key)
            {
                end -- ;
            }
            num[start] = num[end];
            while(start<end&&num[start]<=key)
            {
                start ++;
            }
            num[end] = num[start];
        }
        num[start]=key;
        return start;
    }
}