题目描述:
给定一个无重复元素的数组candidates和一个目标数target,找出candidates
中所有可以使得数字和为target的组合。
示例 1:
Input:candidates=[2,3,6,7],target=7
Output:[[7],[2,2,3]]
示例 2:
Input:candidates=[2,3,5],target=8
Output:[[2,2,2,2],[2,3,3],[3,5]]
解题思路:
利用回溯+剪枝的方法,终止条件是等于target,则认为是找到一组,或者大于target,
此时不符合;剪枝是所在分支下边枝条值小于上边枝条值。
*/
Go语言实现
package main
import (
"fmt"
"sort"
)
func combinationSum(nums []int,target int)(ans [][]int){
if len(nums)==0{
return
}
sort.Ints(nums) /*先排序*/
var temp []int
dfscombination(nums,0,0,&temp,target,&ans)
return
}
func dfscombination(nums []int,value,index int,temp *[]int,target int,ans *[][]int){
if value>target{
return
}else if value==target{
*ans=append(*ans,append([]int{},*temp...))
}else{
/*index的作用是剪去那些下边枝条值小于上边枝条值的分支*/
for i:=index;i<len(nums);i++{
*temp=append(*temp,nums[i]) /*append需要用指针*/
dfscombination(nums,value+nums[i],i,temp,target,ans)
n:=len(*temp)-1
*temp=(*temp)[:n] /*删除最后一个元素*/
}
}
}
func main(){
fmt.Println("数组组合的总和")
nums:=[]int{2,3,6,7}
fmt.Println(combinationSum(nums,8))
}