20.12. 8 46. 全排列 中等

题目

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

思路

  1. 全排列做过基本上都会解了。做过两种全排列,第一种是给定数字,每个数字用一次进行全排列;第二种是给定数字,每个数字不限次数进行全排列。这道题是第一种全排列
  2. 写过几次第二种全排列,一开始没认真思考几十秒就把第二种敲上去,运行一看发现结果不对劲,才发现是第一种。
  3. 换成第一种,因为不熟悉,第一次ac了但是循环写多了一层,时间复杂度爆炸
  4. 思路就是,对于当前位置,后面每一个数字都有机会在当前位置,因为每个数字只出现一次,所以用swap把当前位置的数字和后面选中数字交换即可,递归出来之后再swap回来

代码

class Solution {
public:
    vector<vector<int>> ans;
    vector<vector<int>> permute(vector<int>& nums) {
        recursion(0, nums);
        return ans;
    }
    void recursion(int curr,  vector<int>& nums){
        if(curr == nums.size()){
            ans.push_back(nums);
            return;
        }
        for(int i = curr; i < nums.size(); ++i){
            swap(nums[i], nums[curr]);
            recursion(curr+1, nums);
            swap(nums[i], nums[curr]);
        }
    }
};
posted @ 2020-12-08 16:29  肥斯大只仔  阅读(43)  评论(0编辑  收藏  举报