1. 程式人生 > >代碼題(19)— 組合與排列

代碼題(19)— 組合與排列

dfs tro 個數字 == site back sum 函數 寫法

1、77. 組合

給定兩個整數 nk,返回 1 ... n 中所有可能的 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)— 組合與排列