力扣回溯 77题目组合-->代码逻辑问题

力扣回溯 77题目组合-->代码逻辑问题

问题描述:

力扣回溯问题 77:组合:怎么把循环改成 我自己一步一步的代码逻辑?这里的减枝怎么实现?



相关截图:

http://img1.sycdn.imooc.com//climg/60755d490992361d16960797.jpg

相关代码:

package tracebacking;


import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
* 77. 组合
* 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
*
* 示例:
*
* 输入: n = 4, k = 2
* 输出:
* [
* [2,4],
* [3,4],
* [2,3],
* [1,2],
* [1,3],
* [1,4],
* ]
*/
class Solution77 {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> res = new ArrayList<>();
//验证参数的合法性
if( k<=0 || k > n){
return res;
}


Deque<Integer> path = new ArrayDeque<>();
backtracking(n,k,1,path,res);
return res;


}

private void backtracking(int n, int k,int startIndex, Deque<Integer> path, List<List<Integer>> res) {
// System.out.println(res);
//终止条件
if(path.size() == k){
res.add(new ArrayList<>(path));
return;
}
//依次搜索不同下标的元素--所以我们要添加一个索引
path.add(1);
backtracking(n,k,2,path,res);
path.removeLast();

path.add(2);
backtracking(n,k,3,path,res);
path.removeLast();

path.add(3);
backtracking(n,k,4,path,res);
path.removeLast();

path.add(4);
backtracking(n,k,5,path,res);
path.removeLast();



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

}

public static void main(String[] args) {
Solution77 solution77 = new Solution77();
List<List<Integer>> combine = solution77.combine(4, 2);
System.out.println(combine);
}
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

我没有特别理解你的问题。我测试了一下,你的这段代码是可以 ac 77 号问题的?


class Solution {
    
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> res = new ArrayList<>();
        if( k<=0 || k > n){
            return res;
        }
        Deque<Integer> path = new ArrayDeque<>();
        backtracking(n,k,1,path,res);
        return res;
    }
    
    private void backtracking(int n, int k,int startIndex, Deque<Integer> path, List<List<Integer>> res) {
        
        if(path.size() == k){
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = startIndex; i <= n ; i++) {
            path.add(i);
            backtracking(n,k,i+1,path,res);
            path.removeLast();
        }
    }
}


  • 撕裂天堂3285906 提问者 #1

    我的意思是,for循环类似于遍历多叉树的写法,能不能一个一个调用backtracking()方法,但是如果用这种写法,无法去重,测试结果是所有可能的结果【有重复的】,我想知道:如果可以用这种写法,去重的逻辑要怎么写?

    2021-04-14 00:27:00
  • liuyubobobo 回复 提问者 撕裂天堂3285906 #2

    我还是没明白你说的无法去重是什么意思,上面通过的代码,就是在 for 里调动 backtracking。你把你说的错误代码摆出来?

    2021-04-14 05:45:02
  • 撕裂天堂3285906 提问者 回复 liuyubobobo #3
        public List<List<Integer>> combine(int n, int k) {
            List<List<Integer>>  res = new ArrayList<>();
            //验证参数的合法性
            if(  k<=0 || k > n){
                return res;
            }


            Deque<Integer> path = new ArrayDeque<>();
            backtracking(n,k,1,path,res);
            return res;


        }

        private void backtracking(int n, int k,int startIndex, Deque<Integer> path, List<List<Integer>> res) {
    //        System.out.println(res);
            //终止条件
            if(path.size() == k){
                res.add(new ArrayList<>(path));
                return;
            }
            //依次搜索不同下标的元素--所以我们要添加一个索引
            path.add(1);
            backtracking(n,k,2,path,res);
            path.removeLast();

            path.add(2);
            backtracking(n,k,3,path,res);
            path.removeLast();

            path.add(3);
            backtracking(n,k,4,path,res);
            path.removeLast();

            path.add(4);
            backtracking(n,k,5,path,res);
            path.removeLast();

        }

    ​如上,麻烦波波老师帮看看,谢谢;   我是假设n=4,k=2,我不使用for循环和索引来完成减枝,我想尝试单步逻辑自己加判断减枝,但是不成功;也许不应该这么思考,但是就是卡住了。。。

    2021-04-14 15:29:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师