46. Permutations

January 26, 2017

46. Permutations

Description

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

For example, [1,2,3] have the following permutations:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

Analysis

这道题和之前遇到的回溯法应用有较大的不同,此题要求给出一个字符数组的全排列。

考虑手工计算全排列的过程,从序列中选择第一个数字,之后固定第一个数字,从后续中再选择数字,之后再固定第二个数字,选择第三个数字……循环往复直到获得一个长度与原字符数组相同的的新数组。

所以与之前的回溯法的实现不同,在首轮迭代的过程中,先将第一个数字也就是nums[0]压入栈中,使其固定,构造以nums[0]开头的所有排列;那么之后将以nums[1]为开头,构造所有排列,在此之前,需要将nums[0]从栈中弹出。

代码如下:

code

class Solution {
    void backtracking(vector<vector<int>> & res,vector<int> & temp,vector<int> & nums){
        if(temp.size()==nums.size()){
            res.push_back(temp);
            return;
        }
        for(int i=0;i<nums.size();++i){
            if(find(temp.begin(),temp.end(),nums[i])!=temp.end())   continue;
            temp.push_back(nums[i]);
            backtracking(res,temp,nums);
            temp.pop_back();
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> temp;
        backtracking(res,temp,nums);
        return res;
    }
};

北邮教务系统评教脚本

Published on September 17, 2017

72.Edit distance

Published on September 17, 2017