Problem: 46. 全排列
文章目录
- 题目描述
- 思路及解法
- 复杂度
- Code
题目描述
思路及解法
回溯可以理解为是在对一个多叉树的操作
1.回溯结束条件:当决策路径的长度等于nums数组的长度时,将当前的结果添加到二维结果集res中;
2.每一次决策的选择处理:每次我们先查找当前决策路径中是否存在nums[i],若存在则跳过,直至不存在;
3.先将当前的路径上的值添加到决策路径中,并开始下一层决策,最后将当前决策从决策路径中去除;
复杂度
时间复杂度:
O ( N × N ! ) O(N \times N!) O(N×N!);其中 N N N为数组nums的长度
空间复杂度:
O ( N ) O(N) O(N)
Code
class Solution {//Recode the resultvector<vector<int>> res;
public:/*** Full permutation* * @param nums An array to be fully arranged* @return vector<vector<int>>*/vector<vector<int>> permute(vector<int> &nums) {vector<int> track;backtrack(nums, track);return res;}/*** Implementation of backtracking function** @param nums An array to be fully arranged* @param track Selection path*/void backtrack(vector<int> &nums, vector<int> track) {if (track.size() == nums.size()) {res.push_back(track);return;}for (int i = 0; i < nums.size(); ++i) {if (find(track.begin(), track.end(), nums[i]) != track.end()) {continue;}//Chosetrack.push_back(nums[i]);backtrack(nums, track);track.pop_back();}}
};