/* Pre: perm is initialized, hist[0..rank-1] is descending. * Create the list of permutations (as powers of 2) * that preserve hist[0..rank-1] */ Arraylist specPerm(int rank, int* hist) { int i, j, k, m, x; Intstack prim = newIntstack(rank, NULL) ; Arraylist result = newArraylist(1) ; Arraylist locperm; prim->size = rank; for (i = 0, x = 1; i < rank; i++, x <<= 1) { prim->it[i] = x; } putItem(prim, result) ; i = 0; while (i + 1 < rank) { j = i+1; while (j < rank && hist[i] == hist[j]) j++; if (i+1 < j) { x = result->size; locperm = getPerm(j-i) ; for (k = 0; k < locperm->size - 1; k++) for (m = 0; m < x; m++) putItem(applyPerm(i, result->it[m], locperm->it[k]), result) ; } i = j; } return result; }
Arraylist getPerm(int rank) { int i, j, k; Intstack y, z; if (!permInit) initPerm() ; if (perm[rank] != NULL) return perm[rank]; if (perm[rank-1] == NULL) getPerm(rank-1) ; perm[rank] = newArraylist(rank * perm[rank-1]->size) ; for (i = 0; i < perm[rank-1]->size; i++) { y = perm[rank-1]->it[i]; for (j = 0; j < rank; j++) { z = newIntstack(rank, NULL); for (k = 0; k < j; k++) z->it[k] = y->it[k]; z->it[j] = rank - 1; for (k = j; k < y->size; k++) z->it[k+1] = y->it[k]; z->size = rank; putItem(z, perm[rank]) ; } } return perm[rank]; }
vector<vector<int> > permuteUnique(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int>> ret; int cnt = num.size(); if(!cnt) return ret; bool avl[cnt]; memset(avl,1,sizeof(bool)*cnt); sort(num.begin(),num.end()); vector<int> temp; getPerm(ret,num,temp,avl); return ret; }
void getPerm(vector<vector <int>> &ret, vector<int> &num, vector<int> &temp,bool * avl){ int cnt = num.size(); if(temp.size()==cnt){ ret.push_back(temp); return; } for(int i=0;i<cnt;i++){ if(avl[i] && (i==0 || (num[i]==num[i-1]&& !avl[i-1]) ||(num[i]!=num[i-1]) ) ){ //forget to consider how about the first layer not work but the second layer work. //to handle this, see if i was used or not //if not use, it means it's a parrale branch //otherwise it used temp.push_back(num[i]); avl[i]=false; getPerm(ret,num,temp,avl); temp.pop_back(); avl[i]=true; } } }
void printPerm(int rank) { getPerm(rank) ; mapar(perm[rank], (void (*)(void*)) printCell) ; }