算法
概:这题是Leetcode今天的每日一题,一道中等难度的题,题目很简单,思路也不是很难,但实现确实废了我一点劲,于是我记录一下
来源:力扣(LeetCode)
链接:77.组合
题目
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
思路
- 乍一看,题目就一行描述,明眼人一眼就能看出来是排列组合,但问题在于它不是要你排列组合最后有多少种,而是要你把每种情况都列好,全都返回,而且俩个参数n和k都不是固定的,所以不能固定写几层循环去套,于是我做了一个大循环里面分开套了俩个小循环,分别作用为最后一位后移以及进位。
c++代码
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> r;
vector<int> a;
if (n < k)
{
return r;
}
for (int i = 1; i <= k; i++)
{
a.push_back(i);
}
if (n == k)
{
r.push_back(a);
return r;
}
while (true)
{
while (true)
{
//最后一位后移
if (a[a.size() - 1] == n)
{
break;
}
else
{
r.push_back(a);
a[a.size() - 1]++;
}
}
int b = a.size() - 1;
while (true)
{
//进位
if (a[b] == n - (a.size() - 1 - b))
{
r.push_back(a);
if (b == 0)
{
return r;
}
else
{
a[b-1]++;
b--;
}
}
else
{
for (int i = b + 1; i < a.size(); i++)
{
a[i] = a[i - 1] + 1;
}
break;
}
}
}
return r;
}
};