码迷,mamicode.com
首页 > 其他好文 > 详细

代码题(19)— 组合与排列

时间:2018-07-11 17:55:11      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:循环   eve   代码   else   temp   而不是   排列   str   evel   

1、77. 组合

给定两个整数 n 和 k,返回 1 ... 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> res;
        vector<int> temp;
        combSum(n, k, 1, temp, res);
        return res;
    }
    void combSum(int n, int k, int pos, vector<int> &temp, vector<vector<int>> &res)
    {
        if(temp.size() == k)
        {
            res.push_back(temp);
            return;
        }
        for(int i=pos;i<=n;++i)
        {
            temp.push_back(i);
            combSum(n,k,i+1,temp,res);
            temp.pop_back();
        }
    }
         
};

 2、46. 全排列

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

示例:

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

(1)这道题是求全排列问题,给的输入数组没有重复项,这跟之前的组合和类似,解法基本相同,但是不同点在于那道不同的数字顺序只算一种,是一道典型的组合题,而此题是求全排列问题,还是用递归DFS来求解。这里我们需要用到一个visited数组来标记某个数字是否访问过,然后在DFS递归函数从的循环应从头开始,而不是从level开始,这是和组合不同的地方,其余思路大体相同。

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> temp;
        vector<int> visited(nums.size(),0);
        permuteDfs(nums,0,visited,temp,res);
        return res;
        
    }
    void permuteDfs(vector<int> &nums, int pos, vector<int> &visited, vector<int> &temp, vector<vector<int>> &res)
    {
        if(pos == nums.size())
            res.push_back(temp);
        else
        {
            for(int i=0;i<nums.size();++i)
            {
                if(visited[i] == 0)
                {
                    visited[i] = 1;
                    temp.push_back(nums[i]);
                    permuteDfs(nums,pos+1,visited,temp,res);
                    temp.pop_back();
                    visited[i] = 0;
                }
            }
        }
        
    }
};

 

(2)还有一种递归的写法,更简单一些,这里是每次交换num里面的两个数字,经过递归可以生成所有的排列情况。

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

 

代码题(19)— 组合与排列

标签:循环   eve   代码   else   temp   而不是   排列   str   evel   

原文地址:https://www.cnblogs.com/eilearn/p/9291053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!