首页 > 编程语言 >回溯算法

回溯算法

时间:2022-10-19 21:11:08浏览次数:36  
标签:target nums int res List 算法 回溯 output

视频链接:https://www.bilibili.com/video/BV1yh411m7Yn/?spm_id_from=333.337.search-card.all.click&vd_source=09ee57e950c1151087156a55e2d0aa26

回溯算法的基本过程:进行选择,递归,撤回选择

一般采用深度优先,共有4钟剪枝策略

策略一:每个元素只能使用一次 方法——用used数组剪枝  实例:leetcode46

public static void dfs(int[] nums, List<Integer> path, boolean[] used){
        if(path.size()==nums.length){
            list2.add(new ArrayList<>(path));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(used[i]==true){
                continue;
            }
            used[i]=true;
            path.add(nums[i]);
            dfs(nums,path,used);
            used[i]=false;
            path.remove(path.size()-1);
        }
    }

 剪枝策略二:全排列时给定的数组有重复数字 方法——把当前层重复的枝头剪掉 实例:leetcode47

class Qpl{
    public List<List<Integer>> search(int[] nums){
        Arrays.sort(nums);
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        List<Integer> path=new ArrayList<Integer>();
        boolean[] used=new boolean[nums.length];
        dfs(nums,res,path,used);
        return res;
    }
    public void dfs(int[] nums,List<List<Integer>> res,List<Integer> path,
                    boolean[] used){
        if(path.size()==nums.length){
            res.add(new ArrayList<Integer>(path));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(used[i]){
                continue;
            }
            if(i>0 && nums[i-1]==nums[i] && !used[i-1]){
                continue;
            }
            used[i]=true;
            path.add(nums[i]);
            dfs(nums,res,path,used);
            used[i]=false;
            path.remove(path.size()-1);
        }

    }
}

 剪枝策略三:给定target,要凑出来和等于它的元素 方法——for循环中一旦看到大于target,直接停止i++,同时要进行排序。

class Zh{
    public List<List<Integer>> search(int[] nums,int target){
        Arrays.sort(nums);
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        List<Integer> output=new ArrayList<Integer>();
        dfs(res,output,nums,target,0,0);
        return res;

    }
    public void dfs(List<List<Integer>> res,List<Integer> output,int[] nums,
                    int target,int sum,int start){
        if(sum==target){
            res.add(new ArrayList<Integer>(output));
            return;
        }
        for(int i=start;i<nums.length;i++){
            if(sum+nums[i]>target){
                break;
            }
            output.add(nums[i]);
            dfs(res,output,nums,target,sum+nums[i],i);
            output.remove(output.size()-1);
        }

 

剪枝策略四:对于组合问题,[1,1,6] target是8 输出的数组元素不能重复  如[1,1,6]和[1,6,1]就是重复的数组 方法——在循环时候起始位置为start 实例40组合|| 这个问题包含了以上四种剪枝策略,数组中的元素不能重复使用,[1,3,2] [1,2,3]不能同时出现,这两个问题可以通过for循环中起始位置是start解决,如果数组中出现了重复的元素,[1,1,6] 结果中[1,1,6][1,1,6]不能同时出现,这个就通过nums[i-1]=nums[i] && nums[i]=false进行判断剪枝 当sum>target时,就break

class Zh2{
    public List<List<Integer>> search(int[] nums,int target){
        Arrays.sort(nums);
        List<List<Integer>> res=new ArrayList<List<Integer>>();
        List<Integer> output=new ArrayList<Integer>();
        dfs(res,output,nums,target,0,0);
        return res;
    }
    public void dfs(List<List<Integer>> res,List<Integer> output,int[] nums,int target,int sum,int start){
        if(sum==target){
            res.add(new ArrayList<Integer>(output));
            return;
        }
        for(int i=start;i< nums.length;i++){
            if(sum+nums[i]>target){
                break;
            }
            if(i>start && nums[i-1]==nums[i]) {
                continue;
            }
            output.add(nums[i]);
            dfs(res,output,nums,target,sum+nums[i],i+1);
            output.remove(output.size()-1);
        }
    }

}

 

标签:target,nums,int,res,List,算法,回溯,output
From: https://www.cnblogs.com/zhang12345/p/16767153.html

相关文章

  • 通俗讲解集成学习算法!
    作者:黄星源,Datawhale优秀学习者本文以图文的形式对模型算法中的集成学习,以及对集中学习在深度学习中的应用进行了详细解读。集成学习集成学习,即分类器集成,通过构建并结合多......
  • 希尔排序的算法思想与实现
    希尔排序基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第......
  • 数据挖掘竞赛指南:曾经的数据挖掘少年,如今的阿里算法大佬
     Datawhale 作者:杰少,南京大学硕士简介:杰少,南京大学硕士,天池数据科学家,就职于阿里。KDD19,NIPS18,JDD19第二名,天池竞赛5次Top3,其他数据竞赛平台奖项20余项。数据竞赛近几......
  • 算法高级(46)-波士顿动力机器人ATLAS
    一、引言如果说阿尔法狗是对人类智力的碾压,那么,波士顿动力研发的机器人,正在挑战的是仿生学。波士顿动力公司(BostonDynamics)一致在专注于机器人的研发,每一次波士顿动力放出......
  • 算法高级(45)-阿尔法狗到底有多厉害?
    1997年5月11日,一台名为“深蓝”的超级电脑将棋盘上的一个兵走到C4位置时,人类有史以来最伟大的国际象棋名家卡斯帕罗夫不得不沮丧地承认自己输了。世纪末的一场人机大战终于......
  • 算法高级(44)-人脸识别:张学友的演唱会咋成了逃犯克星了呢?
    最近,网络上流传着一个说法——“风调雨顺萧敬腾,国泰民安张学友”,横批是:萧张至极”。据统计,在张学友演唱会上,已经是第7次有罪犯被抓到,包括被抓现行的和全国在逃人员。也因此,......
  • 【算法训练营day7】LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之
    【算法训练营day7】LeetCode454.四数相加IILeetCode383.赎金信LeetCode15.三数之和LeetCode18.四数之和LeetCode454.四数相加II题目链接:454.四数相加II初次尝......
  • FFmpeg中转场滤镜xfade的时间参数(duration和offset)与算法解读
    xfade转场滤镜小科普最近在研究音视频合成的相关功能,现已有两个视频剪辑。拼合成一个文件显然用concat可以完成,但是过渡生硬,而xfade滤镜可以很方便实现更加缓和的场景切换。......
  • 一文梳理2019年腾讯广告算法大赛冠军方案
    ‍‍作为从本次比赛共157队伍中脱颖而出的冠军方案,评分达到87.9683,从数据清洗、模型构建、目标优化等有非常多值得学习的地方。比赛团队也挺有意思,分别来自哈工大、微软研究......
  • 欧拉路径与Hierholzer算法
    欧拉路径:如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Eulerpath)。欧拉回路:如果一个回路是欧拉路径,则称为欧拉回路(Eulercircuit)。具有欧拉回路的图......