当前位置: 面试刷题>> 第k个组合 (经典算法题500道)
### 题目描述
给定两个整数 `n` 和 `k`,其中 `1 ≤ k ≤ C(n, k)`(`C(n, k)` 表示从 `n` 个不同元素中取出 `k` 个元素的组合数)。请编写一个算法来找出所有可能的 `k` 个数的组合中的第 `k` 个组合。
**注意**:
- 组合中的元素应该是按升序排列的。
- 第 `k` 个组合是按照字典序排列的。
### 示例
假设 `n = 4` 且 `k = 5`(注意:通常 `k` 不会超过 `C(n, k)`,但这里为了说明,我们假设一个小的 `k` 值以展示如何操作,实际情况下需要处理 `k` 的有效范围)。然而,由于 `C(4, 2) = 6`,并且 `k = 5`,这意味着我们实际上要找的是 `{2, 3}` 这个组合(因为 `{1, 2}`, `{1, 3}`, `{1, 4}`, `{2, 3}`, `{2, 4}`, `{3, 4}` 是按字典序排列的所有组合,第5个是 `{2, 3}`)。但更常见的题目设定是 `k` 不会超出实际的组合数。
为了简化,我们考虑 `n = 4, k = 3`,则第3个组合是 `{1, 3}`。
### PHP 示例代码
```php
function getKthCombination($n, $k) {
$result = [];
$start = 1;
$combinations = 0;
while ($k > 0) {
$max = min($n, $start + $k - 1);
$combinations += $max - $start + 1;
if ($combinations >= $k) {
$result[] = $start + $k - $combinations;
$k--;
}
$start++;
}
rsort($result); // 因为我们是从后往前选的,所以需要反转结果
return $result;
}
// 示例
$n = 4;
$k = 3;
$combination = getKthCombination($n, $k);
print_r($combination); // 输出: Array ( [0] => 1 [1] => 3 )
```
**注意**:上述 PHP 代码是基于一种简化的思路,并不直接处理所有可能的组合,而是利用了组合的性质来直接找到第 `k` 个组合。直接处理所有组合并排序的方法在 `n` 较大时会非常低效。
### Python 示例代码
Python 提供了更直接的方法来处理组合,使用 `itertools.combinations` 生成所有组合,然后取第 `k-1` 个(因为索引从0开始)。
```python
from itertools import combinations
def getKthCombination(n, k):
all_combinations = list(combinations(range(1, n + 1), k))
return all_combinations[k - 1]
# 示例
n = 4
k = 3
combination = getKthCombination(n, k)
print(combination) # 输出: (1, 2, 3)
```
### JavaScript 示例代码
JavaScript 中没有内置的 `combinations` 函数,但我们可以使用递归或迭代来生成组合,并找到第 `k` 个。
```javascript
function getKthCombination(n, k) {
let result = [];
let start = 1;
let combinations = 0;
while (k > 0) {
const max = Math.min(n, start + k - 1);
const count = max - start + 1;
combinations += count;
if (combinations >= k) {
result.push(start + k - combinations);
k--;
}
start++;
}
result.sort((a, b) => b - a); // 反转结果
return result;
}
// 示例
const n = 4;
const k = 3;
const combination = getKthCombination(n, k);
console.log(combination); // 输出: [1, 3]
```
以上示例代码均旨在展示如何找到第 `k` 个组合,但请注意,对于非常大的 `n` 和 `k`,直接生成所有组合的方法可能非常低效。在实际应用中,应考虑使用更高效的算法,如基于组合数性质的算法。