ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

0077-组合

2021-11-21 15:33:33  阅读:212  来源: 互联网

标签:return 组合 int res startIndex 0077 path backtracking


给定两个整数 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combinations

参考:

python

# 0077.组合


class Solution:
    def combine(self, n: int, k: int) ->[[int]]:
        """
        回溯法-解决k层循环问题
        :param n:
        :param k:
        :return:
        """
        res = []
        path = []

        def backtracking(n, k, startIndex):
            if len(path) == k:
                res.append(path[:])
                return
            for i in range(startIndex, n+1):
                path.append(i)
                backtracking(n, k, i+1)
                path.pop() # 回溯

        backtracking(n, k, 1)
        return res

class Solution1:
    def combine(self, n: int, k: int) ->[[int]]:
        """
        回溯法-解决k层循环问题-剪枝优化版本
        :param n:
        :param k:
        :return:
        """
        res = []
        path = []

        def backtracking(n, k, startIndex):
            if len(path) == k:
                res.append(path[:])
                return
            # for广度遍历时,不必到n,根据k决定深度,最后可以遍历的起始值应该为 n-(k-len(path))+1
            for i in range(startIndex, n-(k-len(path))+2):
                path.append(i)
                backtracking(n, k, i+1)
                path.pop() # 回溯

        backtracking(n, k, 1)
        return res

golang

package backTrack

var res [][]int
// 回溯法-不剪枝
func combine(n, k int) [][]int {
	if n <= 0 || k <= 0 || k > n {
		return res
	}
	backtrack(n, k, 1, []int{})
	return res
}

func backtrack(n,k,startIndex int, track []int)  {
	if len(track) == k {
		tmp := make([]int, k)
		copy(tmp, track)
		res = append(res, tmp)
	}
/*
	if len(track)+n-startIndex+1 < k {
		return
	}
*/
	for i:=startIndex;i<=n;i++ {
		track = append(track, i)
		backtrack(n,k,i+1,track)
		track = track[:len(track)-1]
	}

}

// 带剪枝回溯
func backtrack1(n,k,startIndex int, track []int)  {
	if len(track) == k {
		tmp := make([]int, k)
		copy(tmp, track)
		res = append(res, tmp)
	}
	// i只需要满足 最后一个遍历值为 n-(k-len(tarck))+1
	if len(track)+n-startIndex+1 < k {
		return
	}
	for i:=startIndex;i<=n;i++ {
		track = append(track, i)
		backtrack(n,k,i+1,track)
		track = track[:len(track)-1]
	}

}


标签:return,组合,int,res,startIndex,0077,path,backtracking
来源: https://www.cnblogs.com/davis12/p/15584622.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有