LeetCode 46.全排列

107 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

 示例 1:

输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入: nums = [0,1]
输出: [[0,1],[1,0]]

示例 3:

输入: nums = [1]
输出: [[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

二、思路分析

在数学中,排列和组合是两个常见的概念,它们都与集合的元素排列顺序有关。但它们的定义和用途略有不同。

排列表示从给定元素的集合中选取一定数量的元素,并按照一定顺序排列的方式。例如,从 {A, B, C} 这个集合中选择两个元素进行排列,可能会得到 AB 或者 BA 这两种不同的排列顺序。排列通常用记号 P(n, r) 表示,其中 n 是集合中元素的总数,r 是要选取的元素个数。公式为:

P(n, r) = n! / (n - r)!

其中,n! 表示 n 的阶乘,即 n × (n-1) × (n-2) × … × 2 × 1。

组合表示从给定元素的集合中选取一定数量的元素,但不考虑它们的排列顺序。例如,从 {A, B, C} 这个集合中选择两个元素进行组合,可能会得到 AB 或者 AC 或者 BC,但是不会区分 AB 和 BA 这两种不同的排列顺序。组合通常用记号 C(n, r) 表示,公式为:

C(n, r) = n! / r!(n-r)!

这个公式可以看作从 n 个不同的元素中,选择 r 个元素的组合数量,而排列则需要考虑元素的排列顺序,因此排列数量通常比组合数量大。

只要弄明白排列和组合的区别,这题就比较好做了。

三、AC代码

class Solution {
public:
    vector<int>path;
    vector<vector<int>>ans;
    int used[21]={0};

    void backtracking(vector<int>& nums){
        if(path.size()==nums.size()){
            ans.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++){
            if(used[nums[i]+10]){
                continue;
            }
            path.push_back(nums[i]);
            used[nums[i]+10]=1;
            backtracking(nums);
            path.pop_back();
            used[nums[i]+10]=0;

        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        backtracking(nums);
        return ans;
    }
};

四、总结

有了前面对组合以及字符串分割的理解,这题做起来就容易多了。