码迷,mamicode.com
首页 > 其他好文 > 详细

leet_3Sum

时间:2017-04-03 17:57:57      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:代码   sum   技术分享   排序   alt   bsp   三元   过滤   解决方法   

一.问题

技术分享

二.解决方法 

1.这个题类似于在一个给定的数组中找出所有满足给定数值的整数对,先看一下这个问题

这个问题的简单的解题思路就是移动两个指针,便利数组,具体代码:

 1 for(int i=0,j=num.length-1;i<j;)
 2           {
 3             //Move the j-pointer to the left till the sum <=c
 4             if(num[i]+num[j]>0)
 5             {
 6               j--;
 7               continue;
 8             }
 9             if(num[i]+num[j]<0)
10             {
11               i++;
12               continue;
13             }
14             if(num[i]+num[j]==0)
15                 System.out.println(num[i]+" "+num[j]);
16                 i++;
17           }

这样会输出重复的答案

技术分享

2.过滤掉重复的结果

 1 for(int i=0,j=num.length-1;i<j;)
 2           {
 3             //Move the j-pointer to the left till the sum <=c
 4             if(num[i]+num[j]>0)
 5             {
 6               j--;
 7               continue;
 8             }
 9             if(num[i]+num[j]<0)
10             {
11               i++;
12               continue;
13             }
14             if(num[i]+num[j]==0)
15                 System.out.println(num[i]+" "+num[j]);
16                 while(num[i] == num[i+1]) i++;
17                 i++;
18           }

技术分享

3.这道题和sum2问题的本质一样,我们可以设置两层循环,外层循环固定一个给定的target,来找另外两个满足sum是-target的数组

 1 //排序
 2           Arrays.sort(num);
 3           for(int i=0;i<num.length;i++)
 4           {
 5             //不能重复(外层)
 6             if((i>0)&&(num[i]==num[i-1]))continue;
 7             //This loop is essentially the same as findpairs() above.
 8             for(int j=i+1,k=num.length-1;j<k;)
 9             {
10               if(num[i]+num[j]+num[k]>0)
11               {
12                 k--;
13                 continue;
14               }
15               if(num[i]+num[j]+num[k]<0){
16                 j++;
17                 continue;
18               }
19               if(num[i]+num[j]+num[k]==0)
20               {
21                   res.add(Arrays.asList(num[i], num[j], num[k]));
22                   //不重复(内层)
23                   while (j < k && num[j] == num[k]) j++;
24                   while (j < k && num[j] == num[k]) k--;
25                   j++; k--;
26                   continue;
27               }
28            }
29         }

总结:在解决类似在数组中找给定和数对,给定和的三元组,一般都可以通过多层向少层转  最后注意:要怎样过滤掉重复的结果集

 

leet_3Sum

标签:代码   sum   技术分享   排序   alt   bsp   三元   过滤   解决方法   

原文地址:http://www.cnblogs.com/nzt-01/p/6662379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!