class Solution { public: // no extra space void permuteUtils(int idx, vector &num, vector > &result) { if(idx == num.size() - 1) { result.push_back(num); return; } for(int i = idx; i < num.size(); ++i) { swap(num[idx], num[i]); permuteUtils(idx + 1, num, result); swap(num[idx], num[i]); } } // with extra space void permute(vector &container, vector &visited, vector &num, vector > &result) { if(container.size() == num.size()) { result.push_back(container); return; } for(int i = 0; i < num.size(); ++i) { if(!visited[i]) { visited[i] = true; container.push_back(num[i]); permute(container, visited, num, result); visited[i] = false; container.pop_back(); } } } vector > permute(vector &num) { vector > result; if(num.size() < 0) return result; /* vector visited(num.size() + 1, false); vector container; permute(container, visited, num, result); */ permuteUtils(0, num, result); return result; } };