Cover image for Interview Classic 150 Questions P46 Permutations

Interview Classic 150 Questions P46 Permutations


Timeline

Timeline

2025-11-29

init


Problem:

Permutations backtracking:

1234567891011121314151617181920212223242526272829303132333435
#include <vector>#include <unordered_set>using std::vector;using std::unordered_set;class Solution {    private:	void backtrace(vector<vector<int> > &res, vector<int> &track, unordered_set<int> &tset, vector<int> &nums)	{		if (track.size() == nums.size()) {			res.push_back(track);		}		for (int num : nums) {			if (!tset.count(num)) {				track.push_back(num);				tset.insert(num);				backtrace(res, track, tset, nums);				track.pop_back();				tset.erase(num);			}		}	}    public:	vector<vector<int> > permute(vector<int> &nums)	{		vector<vector<int> > res;		vector<int> track;		unordered_set<int> tset;		backtrace(res, track, tset, nums);        return res;	}};

Another approach, using swap to exchange the value to the current position, and swap again to restore. This is the fastest.

12345678910111213141516171819202122232425262728293031
#include <vector>using std::vector;class Solution {    private:	void backtrace(vector<vector<int> > &res, vector<int> &nums, int pos)	{		int n = nums.size();		if (pos == n) {			res.push_back(nums);			return;		}		for (int i = pos; i < n; i++) {			std::swap(nums[i], nums[pos]);			backtrace(res, nums, pos + 1);			std::swap(nums[i], nums[pos]);		}	}    public:	vector<vector<int> > permute(vector<int> &nums)	{		vector<vector<int> > res;		backtrace(res, nums, 0);		return res;	}};

leetcode hot100 rewrite: didn’t think of this swap approach

12345678910111213141516171819202122232425262728293031323334353637383940
#include <vector>#include <unordered_set>using std::vector;using std::unordered_set;class Solution {    private:        vector<vector<int> > permutation;        void __permute(vector<int> &nums, unordered_set<int> &uset, vector<int> &curr)        {                if (curr.size() == nums.size()) {                        permutation.push_back(curr);                        return;                }                for (int val : nums) {                        if (uset.count(val)) // If it already exists                                continue;                        // Choose nums[i]                        curr.push_back(val);                        uset.insert(val);                        // Recursion                        __permute(nums, uset, curr);                        // Backtrack, remove nums[i]                        curr.pop_back();                        uset.erase(val);                }        }    public:        vector<vector<int> > permute(vector<int> &nums)        {                unordered_set<int> uset;                vector<int> curr;                __permute(nums, uset, curr);                return permutation;        }};
Loading comments…