1. Backtracking with Visited/Used Boolean Array
Intuition
Maintain current list and used boolean array. At each step, iterate through all N numbers. If !used[i], mark used[i] = true, push nums[i], recurse, and backtrack.
When to apply: Intuitive first approach maintaining a separate path list.
Algorithm
- In
solve(current): - - If
current.length == nums.length, add copy ofcurrenttoresult. - - For
ifrom 0 tonums.length - 1: - - If
!used[i]: - -
used[i] = true,current.push(nums[i]). - - Recurse
solve(current). - -
current.pop(),used[i] = false.
#include <iostream>#include <vector> using namespace std; class Solution { void solve(const vector<int>& nums, vector<bool>& used, vector<int>& current, vector<vector<int>>& result) { if (current.size() == nums.size()) { result.push_back(current); return; } for (int i = 0; i < nums.size(); i++) { if (!used[i]) { used[i] = true; current.push_back(nums[i]); solve(nums, used, current, result); current.pop_back(); // backtrack used[i] = false; } } } public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; vector<bool> used(nums.size(), false); vector<int> current; solve(nums, used, current, result); return result; }}; int main() { Solution sol; vector<int> nums = {1, 2, 3}; auto res = sol.permute(nums); for (const auto& p : res) { cout << "[ "; for (int v : p) cout << v << " "; cout << "] "; } cout << endl; return 0;}Time & Space Complexity
- Time complexity:
O(N! * N)— Explores N! permutations with O(N) array copy at leaves. - Space complexity:
O(N)— Requiresusedarray andcurrentlist of size N.