概述
前面看到的问题是数组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
转载于:https://www.cnblogs.com/ArleneZhangfj/p/10000098.html
最后
以上就是迷你金针菇为你收集整理的数组中三个数和为零的全部内容,希望文章能够帮你解决数组中三个数和为零所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复