LeetCode 第77题 组合

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

示例:

输入: n = 4, k = 2输出:[  [2,4],  [3,4],  [2,3],  [1,2],  [1,3],  [1,4],]
思路: 回溯 BFS搜索

关键在于循环边界的控制. 

eg: n = 4 , k = 2    要求选2个数    1. 目前选了0个数 先从 1~3中选一个数 (不能选第4个数,相当于剪枝,如果第一个数就选4的话,第二个数没法选了)    2. 目前选了1个数 假设第一步在(1,2,3)中选了2,那么此步就在3~4中选一个数.    3. 目前选了2个数,加入到result中.bfs的一条路径结束,继续搜索下一条路径

eg: n = 4 , k = 3    1. 目前选了0个数 先从1~2中选一个数  (不能选第3,4个数,如果第一个数选了3,那么第三个数是选不出来的,如果第一个数选了4,那么第二,三个数是选不出来的)    2. 目前选了1个数 假设第一步在(1,2)中选了1,那么此步就在2~3中选一个数(不能选第4个数,相当于剪枝,如果第二个数选了4的话,第三个数是没法选的)    3. 目前选了2个数 ...    4. 目前选了3个数 ...
 1 class Solution77 {
 2
 3   private List<List<Integer>> res = new ArrayList<>();
 4   private List<Integer> elem = new ArrayList<>();
 5
 6   public List<List<Integer>> combine(int n, int k) {
 7     if (n < 1 || n < k) {
 8       return res;
 9     }
10     search(1, n, k);
11     return res;
12   }
13
14   private void search(int index, int n, int k) {
15     if (elem.size() == k) {
16       List<Integer> temp = new LinkedList<>(elem);
17       res.add(temp);
18     } else {
19       for (int i = index; i <= n - (k - elem.size()) + 1; i++) {
20         elem.add(i);
21         search(i + 1, n, k);
22         elem.remove((Integer) i);
23       }
24     }
25   }
26 }

原文地址:https://www.cnblogs.com/rainbow-/p/10353302.html

时间: 2024-11-10 23:53:02

LeetCode 第77题 组合的相关文章

Leetcode分类解析:组合算法

Leetcode分类解析:组合算法 所谓组合算法就是指:在解决一些算法问题时,需要产生输入数据的各种组合.排列.子集.分区等等,然后逐一确认每种是不是我们要的解.从广义上来说,组合算法可以包罗万象,甚至排序.各种搜索算法都可以算进去.最近读<The Algorithm Design Manual>时了解到这种归类,上网一查,甚至有专门的书籍讲解,而且Knuth的巨著TAOCP的第四卷就叫组合算法,看来还真是孤陋寡闻了!于是最近着重专攻了一下Leetcode中所有相关题目,在此整理一下学习心得.

[LeetCode] 系统刷题5_Dynamic Programming

Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题目实际上是类似于Divide and conquer或者说是DFS,但是在计算过程中有很多重复计算同样的过程的话,那么就可以用Dynamic prgramming/记忆化搜索来完成.基本就是利用空间来简化时间复杂度的过程. 可以/很有可能使用Dynamic programming的条件,满足之一即可. 1.

LeetCode 第 73 题 (Set Matrix Zeroes)

LeetCode 第 73 题 (Set Matrix Zeroes) Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple impro

leetcode中第一题twosum问题解答算法的可行性证明

leetcode中第一题twosum问题解答算法的可行性证明 一.引入 关于leetcode中第一题twosum问题,网上已有不少高人做出过解答,并提出了切实可行的算法实现.我在解答该题时参考了博客http://www.zixue7.com/article-9576-1.html的解答.为让读者更直观地阅读和理解本文,先简要摘录以上博客的内容如下: 题目还原 Two Sum Given an array of integers, find two numbers such that they a

Leetcode第五题_Longest Palindromic Substring

Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. Leetcode第5题,题目大概意思是给一个字符串,从中找出最长的回文串,所谓回文串,就是

LeetCode 第三题,Longest Substring Without Repeating Characters

题目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest s

leetcode第9题-Palindrom Number

这是leetcode的第九题,相对来说比较简单,目的很简单,就是判断一个int型的数是不是回文数.但是有几点需要考虑: 负数应该没有回文数,要加判断!要注意额外的空间申请问题.判断是否是回文数势必要对一个数进行反转,反转的时候就要考虑溢出的问题.实现的代码如下: #include<stdio.h> bool isPalindrom(int x) { if(x<0) return false; else { int tmp=x; int sum=0; while(tmp) { sum=su

LeetCode 第 19 题 (Remove Nth Node From End of List)

LeetCode 第 19 题 (Remove Nth Node From End of List) Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the li

LeetCode 第 342 题(Power of Four)

LeetCode 第 342 题(Power of Four) Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example: Given num = 16, return true. Given num = 5, return false. Follow up: Could you solve it without loops/recursion? 题目很简单,