发现leader是大专毕业,怎么办?

科技   2024-11-13 10:10   上海  

精品推荐

《征服数据结构》专栏:50多种数据结构彻底征服

《经典图论算法》专栏:50多种经典图论算法全部掌握


一网友在网上询问:发现leader是大专毕业,怎么办?他大专和你有啥关系啊。leader学历是大专,可能人家来的早,并且leader不一定需要很高的技术,只要会管理就行。技术需要的是智商,管理需要的是情商,智商高的不一定情商高,所以leader的学历不如你很正常。




--------------下面是今天的算法题--------------


来看下今天的算法题,这题是LeetCode的第77题:组合。


问题描述



来源:LeetCode第77题
难度:中等

给定两个整数 n 和 k,返回范围 [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


问题分析



这题返回从 1 到 n 中所有 k 个数的组合,所谓的组合也就是从数组中选择 k 个数,这种选择只是其中的一个组合。我们知道排列是有顺序的,但组合是没有顺序的,比如[1,2]和[2,1]只能算一个组合。组合选择的过程我们可以把它看作是一棵树,如下图所示:
因为每个数字在每个组合中只能选择一次,所以选择当前数字的时候,下一步只能选择他后面的数字,否则就会出现类似于[1,2]和[2,1]这种重复的组合。当选择个数达到 k 个的时候就不要再往下选了,然后把这个组合添加到最终的集合中,这是一道回溯算法问题,代码非常简单。

JAVA:
public List<List<Integer>> combine(int n, int k) {
    List<List<Integer>> ans = new ArrayList<>();
    dfs(ans, new ArrayList<>(k), n, k, 1);
    return ans;
}

private void dfs(List<List<Integer>> ans, List<Integer> path, int n, int k, int start) {
    if (path.size() == k) {
        ans.add(new ArrayList<>(path));
        return;
    }
    for (int i = start; i <= n; i++) {
        path.add(i);// 选择
        dfs(ans, path, n, k, i + 1);// 递归到下一层
        path.remove(path.size() - 1);// 撤销选择
    }
}

C++:
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> ans;
        vector<int> path;
        dfs(ans, path, n, k, 1);
        return ans;
    }

    void dfs(vector<vector<int>> &ans, vector<int> &path, int n, int k, int start) {
        if (path.size() == k) {
            ans.emplace_back(path);
            return;
        }
        for (int i = start; i <= n; i++) {
            path.emplace_back(i);// 选择
            dfs(ans, path, n, k, i + 1);// 递归到下一层
            path.pop_back();// 撤销选择
        }
    }

Python:
def combine(self, n: int, k: int) -> List[List[int]]:
    ans = []
    path = []

    def dfs(start: int):
        if len(path) == k:
            ans.append(path[:])
            return
        for i in range(start, n + 1):
            path.append(i)  # 选择
            dfs(i + 1)  # 递归到下一层
            path.pop()  # 撤销选择

    dfs(1)
    return ans


笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档

《征服数据结构》专栏

《征服数据结构》数组

《征服数据结构》稀疏表(Sparse Table)

《征服数据结构》单向链表

《征服数据结构》双向链表

《征服数据结构》块状链表

《征服数据结构》跳表

《征服数据结构》队列和循环队列

《征服数据结构》双端队列

《征服数据结构》单调队列

《征服数据结构》栈

《征服数据结构》单调栈

《征服数据结构》双端栈

《征服数据结构》散列表

《征服数据结构》堆

《征服数据结构》字典树(Trie树)

《征服数据结构》ArrayMap

《征服数据结构》SparseArray

《征服数据结构》二叉树

《征服数据结构》二叉搜索树(BST)

《征服数据结构》笛卡尔树

《征服数据结构》AVL树

《征服数据结构》树堆(Treap)

《征服数据结构》FHQ-Treap

《征服数据结构》哈夫曼树

《征服数据结构》Splay 树

《征服数据结构》Splay 树(二)

《征服数据结构》滚动数组

《征服数据结构》差分数组

《征服数据结构》并查集(DSU)

《征服数据结构》LRU缓存

《征服数据结构》LFU缓存

……


《经典图论算法》专栏

《经典图论算法》图的介绍

《经典图论算法》图的表示方式

《经典图论算法》邻接矩阵转换

《经典图论算法》广度优先搜索(BFS)

《经典图论算法》深度优先搜索(DFS)

《经典图论算法》A*搜索算法

《经典图论算法》迭代深化深度优先搜索(IDDFS)

《经典图论算法》IDA*算法

《经典图论算法》双向广度优先搜索

《经典图论算法》迪杰斯特拉算法(Dijkstra)

《经典图论算法》贝尔曼-福特算法(Bellman-Ford)

《经典图论算法》SPFA算法

《经典图论算法》弗洛伊德算法(Floyd)

《经典图论算法》卡恩(Kahn)算法

《经典图论算法》基于DFS的拓扑排序

《经典图论算法》约翰逊算法(Johnson)

《经典图论算法》普里姆算法(Prim)

《经典图论算法》克鲁斯卡尔算法(Kruskal)

《经典图论算法》博鲁夫卡算法(Boruvka)

……


数据结构和算法
王一博,《算法秘籍》作者,1000多页的pdf算法题我也已经整理完成,在公众号“数据结构和算法”中回复关键字“pdf”即可下载。
 最新文章