LeetCode77-组合

LeetCode77-组合

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

示例:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

一、回溯算法

很明显的回溯特征,凡是要求列出全部的可能的题目都可以用回溯算法解决

并且数字都是有序的,可以加以利用,使得确保: n u m s [ i ] < n u m s [ i + 1 ] nums[i] < nums[i + 1]

这里注意,传入向量时要加上引用,可以加快算法的运行,并且减少内存的消耗:

C++代码:

class Solution {
public:
	vector<vector<int>> ans;
	vector<vector<int>> combine(int n, int k) {
		if (k > n)
			return ans;
		vector<int> nums;
		recrusion(n, k, 0, nums);
		return ans;
	}


	void recrusion(int n, int k, int pre, vector<int>& nums) {
		if (nums.size() == k) {
			ans.push_back(vector<int>(nums.begin(), nums.end()));
			return;
		}

		for (int i = pre + 1; i <= n; i++) {
			nums.push_back(i);
			recrusion(n, k, i, nums);
			nums.pop_back();
		}
		return;
	}
};

执行效率:
在这里插入图片描述

加不加引用的差距:
在这里插入图片描述

132ms 对比 1224ms

猜你喜欢

转载自blog.csdn.net/lyd1995/article/details/88873563
今日推荐