📖 Scenario: You are organizing a small event and want to create different groups of people. Each group should have exactly k people, and you want to find all possible groups from a list of people.
🎯 Goal: Build a program that generates all possible combinations of k people from a given list of names.
📋 What You'll Learn
Create a slice of strings called people with exactly these names: "Anna", "Bob", "Cara", "Dave", "Eva"
Create an integer variable called k and set it to 3
Write a recursive function called combine that takes people, k, a start index, a temporary slice for current combination, and a result slice pointer to store all combinations
Print all combinations generated by the combine function
💡 Why This Matters
🌍 Real World
Generating combinations is useful in event planning, team formation, and selecting groups from a list of options.
💼 Career
Understanding combinations and recursion is important for software developers working on algorithms, data analysis, and problem-solving tasks.
Progress0 / 4 steps
1
Create the list of people
Create a slice of strings called people with these exact names: "Anna", "Bob", "Cara", "Dave", "Eva"
DSA Go
Hint
Use people := []string{} to create the list with the exact names inside curly braces.
2
Set the group size k
Create an integer variable called k and set it to 3
DSA Go
Hint
Use k := 3 to set the group size.
3
Write the recursive combine function
Write a recursive function called combine that takes these parameters: people []string, k int, start int, current []string, and result *[][]string. It should generate all combinations of size k from people starting at index start, appending each combination to result.
DSA Go
Hint
Use recursion to build combinations. When len(current) == k, copy current and append it to *result. Loop from start to end, recursively adding people.
4
Print all combinations
Print all combinations stored in result using a for loop inside main. Each combination should be printed on its own line.
DSA Go
Hint
Use a for loop to print each combination in result with fmt.Println.
Practice
(1/5)
1. What does the problem "Generate All Combinations Sum K" ask you to find?
easy
A. All unique combinations of numbers that add up to K
B. The largest number less than K
C. The sum of all numbers from 1 to K
D. The product of all numbers that divide K
Solution
Step 1: Understand the problem goal
The problem asks to find all unique sets of numbers that add exactly to the target sum K.
Step 2: Clarify what combinations mean
Combinations mean groups of numbers where order does not matter, and each number can be used once or multiple times depending on problem rules.
Final Answer:
All unique combinations of numbers that add up to K -> Option A
Quick Check:
Combinations sum K = unique sets adding to K [OK]
Hint: Focus on sums that exactly equal K, ignoring order [OK]
Common Mistakes:
Confusing combinations with permutations
Looking for a single sum instead of all combinations
Ignoring the target sum K
2. Which of the following Go function signatures is correct for a function that generates all combinations summing to K from a slice of integers?
easy
A. func combinationSum(nums []int, target int) int
B. func combinationSum(nums int, target []int) []int
C. func combinationSum(nums []int, target int) []int
D. func combinationSum(nums []int, target int) [][]int
Solution
Step 1: Identify input parameters
The function should take a slice of integers and a target integer sum.
Step 2: Identify return type
It should return a slice of slices of integers, representing all combinations.
Final Answer:
func combinationSum(nums []int, target int) [][]int -> Option D
Quick Check:
Input slice and target int, output slice of int slices [OK]
Hint: Return type must hold multiple combinations ([][]int) [OK]
Common Mistakes:
Swapping parameter types
Returning a single slice instead of slice of slices
Returning an int instead of combinations
3. What is the output of the following Go code snippet?
func main() {
nums := []int{2, 3, 6, 7}
target := 7
result := combinationSum(nums, target)
fmt.Println(result)
}
func combinationSum(nums []int, target int) [][]int {
var res [][]int
var backtrack func(start, target int, path []int)
backtrack = func(start, target int, path []int) {
if target == 0 {
temp := make([]int, len(path))
copy(temp, path)
res = append(res, temp)
return
}
for i := start; i < len(nums); i++ {
if nums[i] > target {
continue
}
backtrack(i, target-nums[i], append(path, nums[i]))
}
}
backtrack(0, target, []int{})
return res
}
medium
A. [[2 2 3] [7]]
B. [[2 3 6] [7]]
C. [[3 3 3] [7]]
D. [[2 2 2 3] [7]]
Solution
Step 1: Understand backtracking logic
The function tries combinations starting from each index, allowing reuse of numbers, and collects paths summing to target.
Step 2: Trace combinations for target 7
Possible sums are [2,2,2,3] and [7] because 2+2+2+3=9 is incorrect, so check carefully: 2+2+2+3=9 (too big), so that is invalid. The actual combinations are [2,2,3] (2+2+3=7) and [7].
Step 3: Verify options
[[2 2 2 3] [7]] shows [2 2 2 3] which sums to 9, invalid. [[2 2 3] [7]] shows [2 2 3] and [7], which is correct.
Final Answer:
[[2 2 3] [7]] -> Option A
Quick Check:
Backtracking finds [2 2 3] and [7] sums [OK]
Hint: Look for combinations that sum exactly to 7 using given nums [OK]
Common Mistakes:
Including invalid sums like [2 3 6]
Ignoring reuse of numbers
Confusing order of elements
4. Identify the bug in this Go function for generating combinations summing to K:
func combinationSum(nums []int, target int) [][]int {
var res [][]int
var backtrack func(start, target int, path []int)
backtrack = func(start, target int, path []int) {
if target == 0 {
res = append(res, path)
return
}
for i := start; i < len(nums); i++ {
if nums[i] > target {
continue
}
backtrack(i, target-nums[i], append(path, nums[i]))
}
}
backtrack(0, target, []int{})
return res
}
medium
A. The target check should be target < 0 instead of target == 0
B. The loop should start from 0 every time, not from start
C. Appending path directly causes shared slice reference issues
D. The function should return a single slice, not slice of slices
Solution
Step 1: Check how path is appended to result
Appending path directly stores the reference, causing all results to point to the same underlying array.
Step 2: Fix by copying path before appending
Make a copy of path slice before appending to res to avoid shared references.
Copy path before append to avoid shared slice bugs [OK]
Hint: Always copy slices before appending to result [OK]
Common Mistakes:
Appending slice references directly
Incorrect loop start index
Wrong base case condition
5. Given a list of integers with duplicates, how would you modify the combination sum algorithm to generate all unique combinations summing to K without duplicates?
Choose the best approach.
hard
A. Use a map to store sums and ignore duplicates after generation
B. Sort the list and skip duplicate numbers during recursion
C. Allow duplicates freely and filter results at the end
D. Increase target by 1 to avoid duplicates
Solution
Step 1: Sort the input list
Sorting helps group duplicates together so they can be skipped during recursion.
Step 2: Skip duplicates in recursion
When iterating, skip numbers equal to the previous one at the same recursion level to avoid duplicate combinations.
Final Answer:
Sort the list and skip duplicate numbers during recursion -> Option B