• leetcode77


     1 class Solution {
     2     public List<List<Integer>> combine(int n, int k) {
     3         List<List<Integer>> combinations = new ArrayList<>();
     4         List<Integer> combineList = new ArrayList<>();
     5         backtracking(combineList, combinations, 1, k, n);
     6         return combinations;
     7     }
     8 
     9     private void backtracking(List<Integer> combineList, List<List<Integer>> combinations, int start, int k, final int n) {
    10         if (k == 0) {
    11             combinations.add(new ArrayList<>(combineList));
    12             return;
    13         }
    14         for (int i = start; i <= n - k + 1; i++) {  // 剪枝
    15             combineList.add(i);
    16             backtracking(combineList, combinations, i + 1, k - 1, n);
    17             combineList.remove(combineList.size() - 1);
    18         }
    19     }
    20 }

    这道题目是求组合,因此[1,2]与[2,1]算是重复的,只保留一种。

    按照14行,每次都从当前位置“向后”寻找,就不会重复了。

    补充一个python的实现:

     1 class Solution:
     2     def backTrack(self,lists,index,k,n,temp,res):
     3         if 0 == k:
     4             res.append(temp[:])
     5             return
     6         for i in range(index,n-k+2):
     7             temp.append(i)
     8             self.backTrack(lists,i+1,k-1,n,temp,res)
     9             temp.pop(-1)
    10         
    11     def combine(self, n: int, k: int) -> List[List[int]]:
    12         lists = list(range(1,n+1))
    13         res = []
    14         self.backTrack(lists,1,k,n,[],res)
    15         return res

    注意加颜色的变量和判断条件,可以加速。

  • 相关阅读:
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    以太坊网络服务分析
    以太坊:P2P网络数据处理流程
    以太坊:P2P网络数据交互
    以太坊虚拟机的基本介绍
    Solidity概述及基本代码展示
    Solidity编译器和简单调试
  • 原文地址:https://www.cnblogs.com/asenyang/p/10997940.html
Copyright © 2020-2023  润新知