LeetCode中使用回溯算法的题目的整理(待更)

组合(medium难度)

LeetCode中使用回溯算法的题目的整理(待更)

本题方法和代码来源:
作者:carlsun-2
链接:https://leetcode-cn.com/problems/combinations/solution/77-zu-he-hui-su-fa-jing-dian-ti-mu-by-carlsun-2/
来源:力扣(LeetCode)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

// 存放符合条件结果的集合
LinkedList<List<Integer>> result = new LinkedList<>();
// ⽤来存放符合条件结果
LinkedList<Integer> path = new LinkedList<>();

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

// 存放符合条件结果的集合
LinkedList<List<Integer>> result = new LinkedList<>();
// ⽤来存放符合条件结果
LinkedList<Integer> path = new LinkedList<>();
void backTracking(int n,int k, int startIndex)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

if(path.size()==k){
    result.add(new LinkedList<>(path));
    return;
}

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

for(int i = startIndex; i <= n ;i++){
    path.add(i);// 处理节点
    backTracking(n,k,i+1);
    path.removeLast();// 回溯,撤销处理的节点
}

LeetCode中使用回溯算法的题目的整理(待更)

完整代码如下:

class Solution {
    // 存放符合条件结果的集合
    LinkedList<List<Integer>> result = new LinkedList<>();
    // ⽤来存放符合条件结果
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n,k,1);
        return result;
    }
    private void backTracking(int n,int k, int startIndex){
        if(path.size()==k){
            result.add(new LinkedList<>(path));
            return;
        }
        for(int i = startIndex; i <= n ;i++){
            path.add(i);// 处理节点
            backTracking(n,k,i+1);// 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始
            path.removeLast();// 回溯,撤销处理的节点
        }
    }
}

LeetCode中使用回溯算法的题目的整理(待更)

for(int i = startIndex; i <= n ;i++){
    path.add(i);
    backTracking(n,k,i+1);
    path.removeLast();
}

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

for(int i = startIndex; i <= n ;i++)

LeetCode中使用回溯算法的题目的整理(待更)

LeetCode中使用回溯算法的题目的整理(待更)

for(int i = startIndex; i <= n - (k - path.size()) + 1;i++)

优化后整体代码如下:
 

class Solution {
    // 存放符合条件结果的集合
    LinkedList<List<Integer>> result = new LinkedList<>();
    // ⽤来存放符合条件结果
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n,k,1);
        return result;
    }
    private void backTracking(int n,int k, int startIndex){
        if(path.size()==k){
            result.add(new LinkedList<>(path));
            return;
        }
        for(int i = startIndex; i <= n - (k - path.size()) + 1;i++){
            path.add(i);// 处理节点
            backTracking(n,k,i+1);// 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始
            path.removeLast();// 回溯,撤销处理的节点
        }
    }
}

 

 

上一篇:LeetCode:77.组合(Java语言)


下一篇:C#l零基础学习传智播客(23)P112-P114-字符串,字符串的练习