要求:给定一个目标值target,一个数组,数组里任意两个数求和,和若等于target,输出这些组合的下标,不重复计算
例:array=[1,2,5,,6,3] target=7
输出:
0,3(0是元素1的下标,3是元素6的下标)(不重复计算:1+6=7 , 6+1=7,只输出一次下标)
1,2
流程:
1、键盘输入数组;
2、设置target值;
3、统计所有满足要求的组合并输出
#include <iostream> #include<vector> #define number 5 using namespace std; vector<vector<int> > search(int arr[], int target) { vector<vector<int> >result; vector<int> res; int add=0; int i,j; for(i=0;i<number-1;i++) { for(j=i+1;j<number;j++) { add=arr[i]+arr[j]; if(add==target) { res.push_back(i); res.push_back(j); result.push_back(res); } res.clear(); } } return result; } int main() { vector<vector<int> > temp; int target=0; int num_arr[number]; int i=0; cout<<"输入一个数列:"; for(i=0;i<number;i++) { cin>>num_arr[i]; } for(i=0;i<number;i++) { cout<<num_arr[i]<<" "; } cout<<"输入target值;"; cin>>target; temp=search(num_arr,target); vector<vector<int> >::iterator iter; for (iter = temp.begin(); iter != temp.end(); iter++) //遍历二维vector { for (int i = 0; i < (*iter).size(); i++) { cout << (*iter)[i] << " " ; } cout<<endl; } }
定义的search子函数返回结果是一个二维的vector,作用是保存所有满足结果的下标组合
它的结构如下图示意(有点丑不要介意):还是以最开始举得例子说:二维vectro类似与二维数组,可是它的长度是可以不断加的,可数组不能,在事先不知道组合个数的情况下,用vector是较好的选择。可以从示意图存入的值为满足要求的所有组合的下标,(0,3)是二维向量的第一个元素,它自己本身也是一个向量,只不过本身的长度在这里都是2,所以也可以把这里替换为一个长度为二的数组;(1,2)为二维向量的第二个元素。
程序运行结果:我这里把数组的长度改为10了,所以输入数列有十个数,target设置为10,输出了所有的组合