从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个不含重复数字的数组 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] <= 10nums中的所有整数 互不相同
二、思路分析
在数学中,排列和组合是两个常见的概念,它们都与集合的元素排列顺序有关。但它们的定义和用途略有不同。
排列表示从给定元素的集合中选取一定数量的元素,并按照一定顺序排列的方式。例如,从 {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;
}
};
四、总结
有了前面对组合以及字符串分割的理解,这题做起来就容易多了。