数组中三个数和为零
前面看到的问题是数组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
没有诗和远方
只有代码和当下