LeetCode 46——全排列

1. 题目

2. 解答

给定一个序列,序列中的任意一个数字均可以做为全排列的最后一位。而后,其他位置元素的肯定即是剩余元素的一个全排列,也就是一个子问题。数组

例子中 [1, 2, 3] 的全排列,最后一位能够是 1 或者 2 或者 3。若是最后一位是 3,前两位即是 [1, 2] 的全排列。code

咱们用递归来实现,变量 k 一开始为序列的长度,每次求解子问题的时候减一。递归终止条件为 k=1,一个元素的全排列只有它本身。blog

class Solution {
public:
    
    vector<vector<int>> result;

    vector<vector<int>> permute(vector<int>& nums) {
        
        int n = nums.size();
        Generate_Premutations(nums, n, n);
        return result;
        
    }
    
    void Generate_Premutations(vector<int>& nums, int n, int k)
    {
        if (k == 1)
        {
            result.push_back(nums);
            return;
        }
        // 任何一个数字均可以做为全排列的最后一位
        for (int i = 0; i < k; i++)
        {
            int temp = nums[i];
            nums[i] = nums[k-1];
            nums[k-1] = temp;
            // 最后一位数字肯定后,余下的是一个全排列的子问题
            Generate_Premutations(nums, n, k-1);
            
            // 恢复原数组
            temp = nums[i];
            nums[i] = nums[k-1];
            nums[k-1] = temp;
        }
    }
};

获取更多精彩,请关注「seniusen」!递归

相关文章
相关标签/搜索