impl Solution {
    fn backtrack(first: usize, result: &mut Vec<Vec<i32>>, nums: &mut Vec<i32>) {
        if first == nums.len() {
            result.push(nums.to_owned());
            return;
        }

        for i in first..nums.len() {
            nums.swap(first, i);
            Solution::backtrack(first + 1, result, nums);
            nums.swap(first, i);
        }
    }

    pub fn permute(nums: Vec<i32>) -> Vec<Vec<i32>> {
        let (mut result, mut nums) = (vec![], nums);
        Self::backtrack(0, &mut result, &mut nums);

        result
    }
}