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],
]

思路:有点像0-1背包问题, 对于从1-n的每一个数字都可以选择放入答案 和不放入答案。 当长度达到k时就是一个符合条件的解。

递归的代码,AC了。只要注意状态的还原就好。

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;class Solution {
public:vector<vector<int> > combine(int n, int k) {vector<vector<int>> ans;combinepart(ans, 1, k, n);return ans;}void combinepart(vector<vector<int>> &ans, int num, int k, int n){static int i = 0;static vector<int> partans;if(num - 1 > n || partans.size() + (n - num + 2) < k) return; //数字超过了n 或者即使后面数字全部压入长度也不够的时候 直接返回 避免不必要的计算if(i == k){ans.push_back(partans);return;}partans.push_back(num); //放入numi++;combinepart(ans, num + 1, k, n);partans.pop_back();i--;combinepart(ans, num + 1, k, n);//不放入num
    }
};int main()
{Solution s;vector<vector<int>> ans = s.combine(3,3);return 0;
}

网上有非递归的代码,可是我好困,懒得看... 速度都差不多的,因为我的递归截枝了,没有多余的操作。

class Solution {
public:vector<vector<int> > combine(int n, int k) {vector<vector<int> >ret;if(k>n||k<=0)return ret;for(int i=1;i<=n-k+1;i++){ret.push_back(vector<int>(1,i));}for(int i=2;i<=k;i++){int num=ret.size();for(int j=0;j<num;j++){int last=ret[j].back();vector<int> pretmp=ret[j];ret[j].push_back(last+1);for(int p=last+2;p+k-i<=n;p++){vector<int> tmp=pretmp;tmp.push_back(p);ret.push_back(tmp);}}}return ret;
}
};

转载于:https://www.cnblogs.com/dplearning/p/4237673.html

【leetcode】Combinations (middle)相关推荐

  1. 【leetcode】解题日记(未完待续)

    开坑,有生之年系列,希望有一天能解出 leetcodeleetcodeleetcode 上的所有题目. 写题解好麻烦,懒得写(手动狗头),进度如下,不定期更新. 总题数 已解答 题解数 2058 23 ...

  2. 【LeetCode】#39组合总和(Combination Sum)

    [LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...

  3. 【Leetcode】100. 相同的树

    题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...

  4. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  5. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  6. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  7. 【leetcode】86. Partition List

    题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  8. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  9. 【Leetcode】79.单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

最新文章

  1. 预备作业02 20162316刘诚昊
  2. Sitecake – 可视化编辑,所见即所得的 CMS
  3. 数据中台到底包括什么内容?一文详解架构设计与组成
  4. 简单程序跟踪调试方式
  5. C#中的默认访问修饰符
  6. 2021 程序媛跳槽记:学习计划篇(已收获字节等offer)
  7. Java编程开发中高效编码的7个技巧?你应该知道……
  8. 在Struts2中实现文件上传(二)
  9. 毕业设计——基于SSM的JAVA图书管理系统(有图书管理前台+后台)
  10. java 切图_分布式切图服务——切图篇
  11. python发送图片邮件exchangelib_Python3.5 执行发邮件Exchangelib(=)
  12. linux下canopen协议视频,CAN协议与CANOpen协议
  13. Mybatis中的事务提交
  14. 北鲲云超算平台能为教育科研做什么
  15. 在VIVADO上实现的非常简易的RISC-V CPU设计(来自《Verilog数字系统设计》夏宇闻著)
  16. Android图片加载优化方案
  17. 是真英雄自洒脱,是真名士自风流!
  18. Unity初级案例-愤怒的小鸟:三:07猪的受伤+08弹弓划线操作+09死亡和加分特效的制作+10游戏逻辑的判定,实现多只小鸟的飞出
  19. python matplotlib,plt.pie,plt.bar(bike数据的分析)
  20. 祝福计算机学院十周年快乐用英语怎么说,计算机学院自动化专业十周年 庆典及颁奖典礼隆重举行...

热门文章

  1. mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...
  2. C++ 11 深度学习(四)结构、权限修饰符
  3. C 之父:C 的成功属于意料之外,C 11是转折点
  4. python生成uuid_咸鱼高赞回答:有什么相见恨晚的Python技巧,附赠python最新教程...
  5. 数据结构实验之图论四:迷宫探索_迷宫搜索类的双向bfs问题(例题详解)
  6. 飞畅科技-工业交换机电源故障初探
  7. 影响PoE交换机不稳定的因素
  8. 21秋期末考试财务会计(一)10166k2
  9. [渝粤教育] 广东-国家-开放大学 21秋期末考试财政学10573k1
  10. 【渝粤教育】国家开放大学2018年春季 0077-21T古代汉语专题 参考试题