数组中三个数和为零

前面看到的问题是数组A中,和为固定值sum的两个数。我们一般的做法是先给数组排序,然后数组前后各有一个下标i、j,如果A[i]+A[j]>sum,则j--,如果A[i]+A[j]<sum,则i++;否则输出A[i]、A[j]。

有一个类似的扩展问题就是:找到一个是数组中和为零的三个数,一般的解决方法也是设置三个下标变量,i,j和k。每次固定i,然后寻找满足条件的j 和k ;并且需要满足i<j<k。

如果条件是这三个数不能重复,C++实现的过程可以借助于set容器(set容器可以去掉数组中重复的数字),具体实现方法如下:

 1 vector<int> FindSumZeroNum(vector<int> A)
 2 {
 3     set<vector<int>>ret;
 4     vector<int>temp;
 5     int n = A.size();
 6         for(int i =0 ;i < n;i++)
 7        {
 8           ret.insert(A[i]);
 9         }
10         vector<int>B;
11         set<vector<int>>::iterator it1 = ret.begin();
12         set<vector<int>>::iterator it2 = ret.end();
13         for(;it1!=it2;it1++)
14        {
15           b.push_back(*it1);
16        }        
17 
18     for (int i = 0; i < n; i++)
19     {
20         int j = i + 1;
21         int k = n - 1;
22         while (j < k)
23         {
24             int sum_two = B[i] + B[j];
25             if (sum_two + B[k] < 0)
26                 j++;
27             else if (sum_two + B[k] > 0)
28                 k--;
29             else
30             {
31                 temp[0] = B[i];
32                 temp[1] = B[j];
33                 temp[2] = B[k];
34                 j++;
35                 k--;
36             }
37         }
38     }
39     return temp;
40 }

该方法并不是此问题最好的解决方案,因为用到了很多STL模板中的容器,只是想进一步学习除了map,vector之外的其他容器的更多使用方法;补充一点基础知识,方便自己以后学习:

1)set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序(set的特性是,所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值)。

2)应该注意的是set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树

3)想要从set中取出指定位置的元素,

set转成list可以解决

List <A> list = new ArrayList<A>(B);//B是set型的

取的时候只要这样

list.get(0);

参考内容:
https://blog.csdn.net/u010732356/article/details/68926478
https://www.cnblogs.com/caiyishuai/p/8646345.html
https://www.cnblogs.com/omelet/p/6627667.html
posted @ 2018-11-22 11:37  博亭柳  阅读(1377)  评论(0编辑  收藏  举报