您的位置:首页 > 游戏 > 手游 > 代码随想录算法训练营第二十四天|

代码随想录算法训练营第二十四天|

2024/12/27 23:13:31 来源:https://blog.csdn.net/dreamtang/article/details/139360326  浏览:    关键词:代码随想录算法训练营第二十四天|

[LeetCode] 77. 组合

[LeetCode] 77. 组合 文章解释

[LeetCode] 77. 组合 视频解释

题目:

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

[LeetCode] 77. 组合 

自己看到题目的第一想法

    for + for + ... + for...

看完代码随想录之后的想法

    答案是如此的精简.

// for 循环递归法
class Solution {private List<List<Integer>> result = new ArrayList<>(); private List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backTracking(n, k, 1);return result;}private void backTracking(int n, int k, int start) {if (path.size() + n - start + 1 < k) {return;}if (path.size() == k) {result.add(new ArrayList<>(path));return;}for (int i = start; i <= n; i++) {path.add(i);backTracking(n, k, i + 1);path.remove(path.size() - 1);}}
}
class Solution {private List<List<Integer>> result = new ArrayList<>(); private List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backTracking(n, k, 1);return result;}private void backTracking(int n, int k, int start) {if (path.size() + n - start + 1 < k) {return;}if (path.size() == k) {result.add(new ArrayList<>(path));return;}path.add(start);backTracking(n, k, start + 1); // 带着 1 去递归path.remove(path.size() - 1);backTracking(n, k, start + 1); // 不带 1 去递归}
}
// 字典推断法. 这个要通过递归得到的结果中, 去推断出该规律.
// 虽然节省递归堆栈的空间, 但是效率并没有提高.
class Solution {private List<List<Integer>> result = new ArrayList<>(); private List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {for (int i = 1; i <= k; i++) {path.add(i);}path.add(n + 1);int j = 0;while (j < k) {j = 0;result.add(new ArrayList<>(path.subList(0, path.size() - 1)));while (j < k && path.get(j) + 1 == path.get(j + 1)) {path.set(j, j + 1);j++;}path.set(j, path.get(j) + 1);}return result;}
}

自己实现过程中遇到哪些困难

    无.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com