Leetcode 第77题: Combinations--组合(C++、Python)

题目地址:Combinations


题目简介:

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

Example:

Input: n = 4, k = 2
Output:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

题目解析:

1、暴力深搜

当n=4, k=1时,对应的Output有

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

结合上面的例子可以看到,k=2时,以4开头的就不能组合长度为2的组合,所以就将[4]抛弃。在前面的三个组合中继续组合,可以看到在k的基础上,要求长度为k+1的组合的时候,要删掉k里最后一个数字为n的组合。

C++版:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> ans;
        if (k == 1)
        {
            for (int i = 0; i < n; i++)
            {
                vector<int> temp;
                temp.push_back(i + 1);
                ans.push_back(temp);
            }
            return ans;
        }
        else
        {
            vector<vector<int>> last_ans = combine(n, k - 1);
            int len = last_ans.size();
            for (int i = 0; i < len; i++)
            {
                if (last_ans[i].back() != n)
                {
                    int tmp = last_ans[i].back();
                    while(++tmp != n + 1)
                    {
                        vector<int> temp = last_ans[i];
                        temp.push_back(tmp);
                        ans.push_back(temp);
                    }
                }
            }
        }
        return ans;
    }
};

Python版:

class Solution(object):
    def combine(self, n, k):
        ans = []
        if k == 1:
            return [[i] for i in range(1,n+1)]
        else:
            last_ans = self.combine(n,k - 1)
            for ls in last_ans:
                if(ls[-1] != n):
                    tmp = ls[-1] + 1
                    while tmp != n + 1:
                        temp = []
                        temp.extend(ls)
                        temp.append(tmp)
                        ans.append(temp)
                        tmp += 1
        return ans

2、直接暴力

可以观察到当n和k确定时,对应的组合集中最大的第一个数字便得到了确定。例如当n = 4, k = 2时,开头最大为3=n - k + 1。只要在其后增加足够的数字即可。

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int> > ans;
        for (int i = 0; i < n - k + 1; i++)
        {
            vector<int> temp;
            temp.push_back(i + 1);
            ans.push_back(temp);
        }
        k--;
        while(k--)
        {
            vector<vector<int> > temp_ans;
            int len = ans.size();
            for (int i = 0; i < len; i++)
            {
                int tmp = ans[i].back();
                while(++tmp != n + 1)
                {
                    vector<int> temp = ans[i];
                    temp.push_back(tmp);
                    temp_ans.push_back(temp);
                }
            }
            ans = temp_ans;
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/chao_shine/article/details/89419639