【17】Algorithme de retour en arrière

Idée:

Bouclez un niveau à la fois, appelez la récursivité dans chaque boucle de niveau, jugez si elle répond aux exigences, puis revenez en arrière.

Un peu abstrait comme retrouver ses clés à la maison :

Commencez par le premier étage de la maison (pour la boucle du premier étage (i=0)) ----->entrez dans la pièce a------>ouvrez la première boîte [introuvable] récursion

                                   Plus de cases---[Introuvable] Ouvrir la deuxième case <-----Fermer la première case Retour en arrière

                                   Sortir de la pièce a------>entrer dans la pièce b---------->ouvrir la première boîte...

Ici, entrer dans la pièce et ouvrir la boîte est comme un appel récursif, fermer la boîte et fermer la porte est comme faire marche arrière.

Alors voilà la somme accumulée == le but est de trouver la clé, sinon on continuera à chercher une à une.                                                                 

      

Code:

func combinationSum(candidates []int, target int) [][]int {
	
    //定义外部变量
    var result [][]int
	var currentCombination []int

	sort.Ints(candidates) // 首先对数组进行排序

	var backtrack func(startIdx, currentSum int)
	backtrack = func(startIdx, currentSum int) {
        //1)出口
		if currentSum == target {
			// 如果当前和等于目标值,将当前组合添加到结果中
			result = append(result, append([]int{}, currentCombination...))
			return
		}
        //2)开始遍历
		for i := startIdx; i < len(candidates); i++ {
            //1、和大于目标值
			if currentSum+candidates[i] > target {
				break // 如果当前和加上当前元素已经超过目标值,跳出循环
			}
            //2、排除重复项
			if i > startIdx && candidates[i] == candidates[i-1] {
				continue // 跳过重复的元素,避免重复的组合
			}
            // 若 和 小于 目标值 
            //放入这个元素
			currentCombination = append(currentCombination, candidates[i]) // 将当前元素加入当前组合
            //进入递归
			backtrack(i, currentSum+candidates[i])                         // 递归调用,继续查找下一个元素
            //回溯出来的操作:取出这个元素
			currentCombination = currentCombination[:len(currentCombination)-1] // 回溯,移除当前元素
		}
	}

	backtrack(0, 0) // 从第一个元素开始查找

	return result
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_67225910/article/details/132586600
conseillé
Classement