Skip to content

Latest commit

 

History

History
65 lines (47 loc) · 1.89 KB

File metadata and controls

65 lines (47 loc) · 1.89 KB

77. Combinations (Medium)

https://leetcode.com/problems/combinations/description/

Given two integers n and k, return all possible combinations of k numbers chosen from the range [1, n].

You may return the answer in any order.

Example 1:

Input: n = 4, k = 2
Output: [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
Explanation: There are 4 choose 2 = 6 total combinations.
Note that combinations are unordered, i.e., [1,2] and [2,1] are considered to be the same combination.

Example 2:

Input: n = 1, k = 1
Output: [[1]]
Explanation: There is 1 choose 1 = 1 total combination.

Constraints:

1 <= n <= 20
1 <= k <= n

🚡java

//backtrack
class Solution {

    private int n;
    private int k;

    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> comb = new ArrayList<>();
        this.n = n;
        this.k = k;
        backtrack(1, list, comb);
        return list;
    }
    private void backtrack(int firstNum, List<List<Integer>> list, List<Integer> comb){
        if(comb.size() == k){
            list.add(new ArrayList<>(comb)); // store a deep copy
            return;
        }

        for (int num = firstNum; num <= n; num++) {
            // 1. Include the current number in the combination
            comb.add(num); 
            // 2. Recursively build combinations with numbers greater than the current one
            // This ensures we don't use the same number twice and maintains ascending order
            backtrack(num + 1, list, comb);
            // 3. Backtrack: Remove the last number to try other possibilities
            // (Undo the choice to explore other paths)
            comb.remove(comb.size() - 1);
        }

        return;
    }
}