LeetCode刷题笔记(Permutations)

今天状态不是很好,刷了一道正好是当时面试被问到的题目,下面就和大家分享一下经验吧!

题目如下:

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]
Output:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

题意分析:

给定一个包含不同整数的集合,请返回它的全排列。

方法一(递归回溯法)

与“https://blog.csdn.net/Vensmallzeng/article/details/96103159”的方法一的思路相同,不过以下几点区别:

① 在同一排列中,用过的数字不能重复使用,但在不同的排列中,用过的数字可以再次使用;

② 对于数字应该用push_back方式予以累加;

解题代码如下: 

class  Solution{
private:
    vector<vector<int>> res;
    vector<bool> used;
    void Findpermute(vector<int>& nums, int k, vector<int>& temp){
        if (k==nums.size())
            {res.push_back(temp);
            return;}
        for (int i = 0; i < nums.size(); i++) {
                if (!used[i]){
                    temp.push_back(nums[i]);
                    used[i] = true;
                    Findpermute(nums, k+1,temp);
                    temp.pop_back();
                    used[i] = false;
                }

        }
        return;

    }
public:
    vector<vector<int>> permute(vector<int>& nums){
       if(nums.size()==0) return res; 
       used = vector<bool>(nums.size(), false);
       vector<int> temp;
       Findpermute(nums, 0,temp);
       return res;
    }
    
};

提交后的结果如下: 

 

方法二(递归交换法)

通过每次递归调用,交换nums里面的两个数字可以生成所有的排列情况。该方法写起来更简洁。

解题代码如下: 

class  Solution{
public:
    vector<vector<int>> permute(vector<int> nums) {
        vector<vector<int>> res;
        if (nums.size() == 0) return res;
        Findpermute(nums, 0, res);
        return res;
    }
    
    void Findpermute(vector<int> nums, int start, vector<vector<int>>& res){
        if(start == nums.size()) {
            res.push_back(nums);
            return;
        }
        for (int i = start; i < nums.size(); i++) {
            swap(nums[start], nums[i]);
            Findpermute(nums, start+1, res);
            swap(nums[start], nums[i]);
        }
    }
};

提交后的结果如下: 

 

 

 

日积月累,与君共进,增增小结,未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值