关于三个数之和为0的进阶解法V2

来源:互联网 发布:怎么创建三级域名 编辑:程序博客网 时间:2024/06/16 19:18

由于前一个版本算法在面对输入数据跨度较大时(如[-999999,4,8989898])会出现极大的空间浪费,故本次算法改进使用链表进行求和查找。但由于链表不能随机读取数据,所以效率比前一算法略低,但是可以极大地节约空间,而且也满足网站的性能要求。

public class Solution{    public ArrayList<ArrayList<Integer>> threeSum(int[] num)     {        // Start typing your Java solution below        // DO NOT write main() function        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();          ArrayList<Integer> tmp;          Link head,end;        int a,b,c;          if(num.length <3)            {                return res;            }         head = new Link();        end = new Link();        head.num = num[0];        head.conut = 1;        head.pre=null;        head.next=null;        end = head;        for(int i = 1 ; i < num.length; i++)        {            Link p;            for(p = head;p.num < num[i] && p.next != null ;p = p.next);            if(p.num < num[i])            {                Link q = new Link();                q.num = num[i];                q.conut = 1;                q.next=p.next;                p.next=q;                q.pre=p;                end = q;            }            else if(p.num > num[i])            {                Link q = new Link();    q.num = num[i];q.conut = 1;if (p.pre != null)                 {p.pre.next = q;}q.pre = p.pre;p.pre = q;q.next = p;if (q.pre == null)                 {head = q;}            }            else            {                p.conut++;            }        }        Link p = head;        a = p.num;        while(a <= 0 && p!=null)        {            a = p.num;            p.conut--;            Link q = end;            b = q.num;            while(b >= 0 && q!=null)            {                b = q.num;                q.conut--;                c = -a-b;                if(a<=c && c<=b)                {                    Link m;                    for(m = p;m.num < c && m.next!= null;m = m.next);                    if(m.num == c && m.conut >0)                    {                       tmp = new ArrayList<Integer>();                          tmp.add(a);                          tmp.add(c);                          tmp.add(b);                         res.add(tmp);                      }                                    }                q.conut++;                q = q.pre;            }            p.conut++;            p=p.next;        }        return res;        }    private class Link    {        int num;        int conut;        Link pre,next;    }}


原创粉丝点击