数组拆分为两个子数组

怎么把一个数组拆分成两个非空的子数组,而且如果两个数组里的元素能够一一对应,那么不论顺序如何,都认为是重复的:例如{1,2}和{2,1}是一样的。

输入例子:

1,2,3

输出例子:

12 3
21 3    //1 3:2也一样
31 2

输入例子:

1 2 2

输出例子:

12 2  //2 2: 1
21 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;
}

复杂度很高。。。
求思路。。。

猜你喜欢

转载自blog.csdn.net/luvalluo/article/details/81590230