LeetCode刷题——组合#77#Medium

组合的思路探讨与源码
     组合的题目如下图,该题属于数组和回溯类型的题目,主要考察对于回溯方法的理解和遍历技巧的使用。本文的题目作者想到2种方法,分别是深度优先搜索方法DFS和递归方法,其中深度优先搜索方法使用Java进行编写,而递归方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用深度优先方法搜索,首先初始化参数,将结果列表和路径列表进行初始化,并且调用深度优先搜索函数。在深度优先搜索函数内部,首先判断这个路径列表长度是否和k值相等,如果相等就直接把路径列表的结果加入到最终返回结果内并直接返回。否则就开始进行遍历,将数据从1开始遍历,把数据加入到路径列表中,然后反复调用搜索函数直到满足等于k的条件后,将路径列表里的最后的元素移除,直到遍历结束并最后返回结果。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> resFinal = new ArrayList<>();
        LinkedList<Integer> searchPathList = new LinkedList<>();
        dfsSearch(n, k, 1, searchPathList,resFinal);
        return resFinal;
    }

    public void dfsSearch(int n, int k, int beginNum, LinkedList<Integer> searchPathList, List<List<Integer>> resFinal) {
        if (searchPathList.size() == k) {
            resFinal.add(new ArrayList<>(searchPathList));
            return;
        }
        for (int jr = beginNum; jr <= n; jr++) {
            searchPathList.add(jr);
            dfsSearch(n, k, jr + 1, searchPathList,resFinal);
            searchPathList.removeLast();
        }
    }
}

在这里插入图片描述
    显然,我们看到深度优先搜索方法的效果一般,同时还可以使用递归的方法进行处理。首先把结果列表初始化,并且判断异常情况,如果n比1小或者n比k小就直接返回空。如果k等于0也直接返回空。如果n和k相等,就返回全排列结果。然后开始把列表分为两部分,并且都去递归调用当前的函数,这两部分分别是从1到n-1去选k个数字并且组合里面是没有n的,以及从1到n-1去选k-1个数字并且组合里包括n的。然后再判断part1是否不为空,如果不为空就遍历它并插入n,最终将两个部分的结果进行拼接并返回最终结果。所以按这个思路就可以解决,下面是Python代码部分:

#喷火龙与水箭龟
class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        resFinal = [[]]
        allList = []
        allTmp = []
        if n < 1 or n < k:
            return []
        if k == 0:
            return resFinal
        for ij in range(1,n+1):
            allTmp.append(ij)
        allList.append(allTmp)
        if n == k:
            return allList
        part1 = self.combine(n-1, k-1)
        part2 = self.combine(n-1, k)
        if part1:
            for jrs in part1:
                jrs.append(n)
        resFinal = part1 + part2
        return resFinal

在这里插入图片描述
    从结果来说Java版本的深度优先搜索方法的效率一般,而Python版本的递归方法的速度不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

おすすめ

転載: blog.csdn.net/qq_26727101/article/details/121178035