Combinations leetcode 组合问题

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

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

这类组合问题的思路常见的一个办法就是递归。
如果show(在结果里面show)那么该怎么处理,
如果not show (不出现在结果里面)该怎么处理。

void C(vector<int> array, int start, int k, vector<int> result, int index, vector<vector<int>>* finalvec)
{
    if (index == k) //found one
    {
        finalvec->push_back(result);
        return;
    }
    if (start<array.size())
    {
        //show
        result[index] = array[start];
        C(array, start + 1, k, result, index + 1, finalvec);

        C(array, start + 1, k, result, index, finalvec);
    }

}


vector<vector<int> > combine(int n, int k) {
    vector<int> array(n);
    vector<vector<int>> finalresult;
    for (int i = 1; i <= n; i++)
    {
        array[i - 1] = i;
    }
    vector<int> result(k);

    int start = 0;
    int index = 0;

    C(array, start, k, result, index, &finalresult);

    return finalresult;

}

 

类似的另外一个题目是 skip digits encoding, 比如说某个国家的人不喜欢4, 那么在所有的number里都不能出现4, 现在给定一个数 1876, 应该对应于real life的哪个数。

思路:
100~999中有多个数不包含digits 4, 因为是三位数,每个位置上出现的数字都是独立的,因为不能是4, 那每一位上不出现的可能性是C(9,1)
那么正好在 100~999中 C(9,1)* C(9,1)*C(9,1)
同样道理 10~99 中C(9,1)*c(9,1)
0~9 C(9,1)

int convert(int magic, int hatedigit)
{
    int outnumber = 0;
    int basep = 9;
    int p = 1;

    while (magic>0)
    {
        int digits = magic % 10;
        if (digits> hatedigit) outnumber += (digits - 1)* p;
        else outnumber += digits*p;
        p *= 9;
        magic = magic / 10;
    }
    return  outnumber;
}

 














posted @ 2014-02-08 07:18  来自海边的一片云  阅读(213)  评论(0编辑  收藏  举报