Skip to content
Merged
24 changes: 24 additions & 0 deletions go/39-Combination-Sum.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package main

func combinationSum(candidates []int, target int) [][]int {
ans := make([][]int, 0)
curr := make([]int, 0)
var backtrack func(idx int, currSum int, curr []int)
backtrack = func(idx int, currSum int, curr []int) {
if currSum == target {
ans = append(ans, append([]int{}, curr...))
return
}
if currSum > target {
return
}
for i := idx; i < len(candidates); i++ {
curr = append(curr, candidates[i])
backtrack(i, currSum+candidates[i], curr)
curr = curr[:len(curr)-1]
}

}
backtrack(0, 0, curr)
return ans
}
30 changes: 30 additions & 0 deletions go/40-Combination-Sum-II.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package main

import "sort"

func combinationSum2(candidates []int, target int) [][]int {
ans := make([][]int, 0)
curr := make([]int, 0)
sort.Ints(candidates)
var backtrack func(idx int, currSum int, curr []int)
backtrack = func(idx int, currSum int, curr []int) {
if currSum == target {
ans = append(ans, append([]int{}, curr...))
return
}
if currSum > target {
return
}
for i := idx; i < len(candidates); i++ {
if i > idx && candidates[i] == candidates[i-1] {
continue
}
curr = append(curr, candidates[i])
backtrack(i+1, currSum+candidates[i], curr)
curr = curr[:len(curr)-1]
}

}
backtrack(0, 0, curr)
return ans
}
25 changes: 25 additions & 0 deletions go/46-Permutations.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package main

func permute(nums []int) [][]int {
n := len(nums)
ans := make([][]int, 0)
curr := make([]int, 0, n)
vis := make(map[int]int)
var backtrack func(idx int)
backtrack = func(idx int) {
if len(curr) == n {
ans = append(ans, append([]int{}, curr...))
}
for i := 0; i < n; i++ {
if vis[i] == 0 {
vis[i]++
curr = append(curr, nums[i])
backtrack(i + 1)
curr = curr[:len(curr)-1]
vis[i]--
}
}
}
backtrack(0)
return ans
}
20 changes: 20 additions & 0 deletions go/78-Subsets.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package main

func subsets(nums []int) [][]int {
ans := make([][]int, 0)
curr := make([]int, 0)
var backtrack func(idx int)
backtrack = func(idx int) {
ans = append(ans, append([]int{}, curr...))
if idx == len(nums) {
return
}
for i := idx; i < len(nums); i++ {
curr = append(curr, nums[i])
backtrack(i + 1)
curr = curr[:len(curr)-1]
}
}
backtrack(0)
return ans
}
25 changes: 25 additions & 0 deletions go/90-Subsets-II.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package main

import "sort"

func subsetsWithDup(nums []int) [][]int {
n := len(nums)
ans := make([][]int, 0, 1<<n)
curr := make([]int, 0, n)
sort.Ints(nums)
var backtrack func(idx int)
backtrack = func(idx int) {
ans = append(ans, append([]int{}, curr...))
for i := idx; i < n; i++ {
if i > idx && nums[i] == nums[i-1] {
continue
}
curr = append(curr, nums[i])
//not backtrack(idx + 1)!!
backtrack(i + 1)
curr = curr[:len(curr)-1]
}
}
backtrack(0)
return ans
}