怎么把一个数组拆分成两个非空的子数组,而且如果两个数组里的元素能够一一对应,那么不论顺序如何,都认为是重复的:例如{1,2}和{2,1}是一样的。
输入例子:
1,2,3
输出例子:
1 :2 3
2 :1 3 //1 3:2也一样
3 :1 2
输入例子:
1 2 2
输出例子:
1:2 2 //2 2: 1
2:1 2 //2 1: 2
1.递归求解,去重
bool isRepeat(const vector<vector<int>>&res, const vector<int>& src, vector<int>& v1, vector<int>& v2) {
for (int i = 0; i < res.size(); i++) {
if (res[i] == v1 || res[i] == v2)return true;
}
return false;
}
//把一个数组拆分成不为空的两个,返回第一部分的list:
void splitArray(vector<vector<int>>&res,vector<int>& src,vector<int>v1,vector<int>v2,int index) {
if (index == src.size()) {
if (v1.size() > 0 && v1.size() < src.size() && !isRepeat(res, src, v1, v2)) {
res.push_back(v1);
for_each(v1.begin(), v1.end(), [](int a) {cout << a << " "; });
cout << ":";
for_each(v2.begin(), v2.end(), [](int a) {cout << a << " "; });
cout << endl;
}
return;
}
int len = src.size();
if (len < 2)return;
v2.push_back(src[index]);
splitArray(res,src,v1,v2,index+1);
v1.push_back(src[index]);
v2.pop_back();
splitArray(res,src,v1,v2,index+1);
}
int main(void) {
vector<int>v;
vector<vector<int>>vv;
int a;
while (cin >> a) {
v.push_back(a);
}
sort(v.begin(),v.end());
splitArray(vv,v,vector<int>(), vector<int>(),0);
system("pause");
return 0;
}
复杂度很高。。。
求思路。。。