回溯算法-Java【力扣】【算法学习day.14】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


什么是回溯算法

        回溯搜索法是一种搜索方式,它通过不断尝试各种可能的选择,当发现当前选择不满足条件时,就回溯到上一个状态,重新进行选择,直到找到满足条件的解或者遍历完所有可能的情况。例如在解决迷宫问题时,可以使用回溯搜索法,从一个起始位置开始尝试不同的方向前进,如果遇到死路就回溯到上一个位置,重新选择其他方向。


习题

1.组合

题目链接:77. 组合 - 力扣(LeetCode)

题面:

基本分析:抽象成树的结构进行递归

代码:

class Solution {
    int len;
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> ans = new ArrayList<>();
         Stack<Integer> stack = new Stack<>();
         len = k;
         recursion(1,n,ans,stack);
         return ans;
    }
    public void recursion(int start,int end,List<List<Integer>> ans,Stack<Integer> stack){
        if(stack.size()==len){
            ans.add(new ArrayList<>(stack));
            return;
        }
        for(int i = start;i<=end - (len - stack.size()) + 1;i++){
            stack.push(i);
            recursion(i+1,end,ans,stack);
            stack.pop();
        }
    }
}

2.组合总和III

题目链接:216. 组合总和 III - 力扣(LeetCode)

题面:

基本分析:和上一题类似,只不过多一个判断相加之和 

代码:

class Solution {
    int len;
    int target;
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> ans = new ArrayList<>();
        len = k;
        target = n;
        Stack<Integer> stack = new Stack<>();
        recursion(1,9,stack,ans,0);
        return ans;
    }
    public void recursion(int l,int r,Stack<Integer> stack,List<List<Integer>> ans,int sum){
        if(sum>target)return;
        if(stack.size()>len)return;
        if(sum==target&&stack.size()==len)ans.add(new ArrayList<>(stack));
        for(int i = l;i<=r-(len-stack.size())+1;i++){
            stack.push(i);
            recursion(i+1,r,stack,ans,sum+i);
            stack.pop();
        }
    }
}

3.电话号码的字母组合

题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)

题面:

基本分析:暴力递归

代码:

class Solution {
        char[][] arr = {{'d'},{'a'},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};
        int count = -1;
        int len;
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<>();
        if(digits.equals(""))return list;              
        char[] brr = digits.toCharArray();
        int n = brr.length;
        len = n;
        char[] crr = new char[n];
        recursion(0,brr,crr,list);
        return list;
    }
    public void recursion(int u,char[] brr,char[] crr,List<String> list){
        if(u==len){
            list.add(new String(crr));
            return;
        }
        char c = brr[u];
        char[] drr = arr[c-'0'];
        int m = drr.length;
        for(int i = 0;i<m;i++){
            crr[++count]=drr[i];
            recursion(u+1,brr,crr,list);
            count--;
        }
    }
}

4.组合总和

题目链接:39. 组合总和 - 力扣(LeetCode)

题面:

基本分析:注意剪枝来去重

代码:

class Solution {
    int[] arr;
    int len;
    int t;
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        arr = candidates;
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> stack = new Stack<>();
        len = candidates.length;
        t = target;
        Arrays.sort(arr);
        recursion(list,stack,0,0);
        return list;
    }
    public void recursion(List<List<Integer>> list,List<Integer> stack,int sum,int l){
        if(sum==t){
            list.add(new ArrayList<>(stack));
            return;
        }
        for(int i = l;i<len;i++){
            if(sum+arr[i]>t)return;
            stack.add(arr[i]);
            recursion(list,stack,sum+arr[i],i);
            stack.remove(stack.size()-1);
        }
    }
}

5.组合总和II

题目链接:40. 组合总和 II - 力扣(LeetCode)

题面:

基本分析:注意重复元素导致的重复,用set是一种解决办法但是会超时

代码:

class Solution {
    int t;
    int[] arr;
    int n;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        arr = candidates;
        Set<List<Integer>> list = new HashSet<>();
        List<Integer> stack = new ArrayList<>();
        n = arr.length;
        t = target;
        recursion(list,stack,0,0);
        return new ArrayList<>(list);
    }
    public void recursion(Set<List<Integer>> list,List<Integer> stack,int sum,int l){
        if(sum==t){
            list.add(new ArrayList<>(stack));
            return;
        }
        for(int i =l;i<n;i++){
            if(sum+arr[i]>t)return;
            if (i > l && arr[i] == arr[i - 1]) {
                continue;
            }
            stack.add(arr[i]);
            recursion(list,stack,sum+arr[i],i+1);
            stack.remove(stack.size()-1);
        }
    }
}

后言

上面是回溯算法的基本概念和部分习题,下一篇会讲解回溯算法的其他相关力扣习题,希望有所帮助,一同进步,共勉!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904978.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp和vite项目配置多环境编译,增加测试环境变量配置--mode test

如果你的项目是使用vite和uniapp配置开发的&#xff0c;就可以在代码里面获取到这些变量&#xff0c;但是开发&#xff0c;测试和发布是不同的请求地址&#xff0c;所以需要配置。Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量&#xff1a; .env …

CUDA环境安装终极指南——Linux(其它系统也一样)

文章目录 前言检查驱动配置nvcc安装cudnn完活 前言 不用看其它文章了&#xff0c;这篇文章保你不踩任何坑&#xff0c;安装方法简单快速 检查驱动 检查驱动是否安装&#xff0c;输入以下命令 nvidia-smi如果驱动已经安装&#xff0c;则可跳过此步&#xff0c;否则&#xff…

学习笔记:ElasticSearch搜索引擎

学习视频&#xff1a;【尚硅谷】ElasticSearch教程入门到精通&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 学习笔记&#xff1a;Elasticsearch学习笔记 目录 第1章 Elasticsearch概述01. 开篇02. 技术选型 2. 第二章 ElasticSearch入门03. 环境准备04. …

工业协议网关:物联网时代的智慧桥梁

在物联网技术蓬勃发展的今天&#xff0c;工业协议网关作为连接工业设备和物联网系统的关键设备&#xff0c;正在发挥着越来越重要的作用。本文将带您深入了解工业协议网关的功能、应用场景以及它在工业智能化进程中的重要作用。 什么是工业协议网关&#xff1f; 工业协议网关…

机器学习中的嵌入是什么?

一、说明 嵌入是真实世界对象的数字表示&#xff0c;机器学习&#xff08;ML&#xff09;和人工智能&#xff08;AI&#xff09;系统利用它来像人类一样理解复杂的知识领域。例如&#xff0c;计算算法了解 2 和 3 之间的差为 1&#xff0c;这表明与 2 和 100 相比&#xff0c;2…

Python | Leetcode Python题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; class Solution:def findMinMoves(self, machines: List[int]) -> int:tot sum(machines)n len(machines)if tot % n:return -1avg tot // nans, s 0, 0for num in machines:num - avgs numans max(ans, abs(s), num)return ans

【PTA】4-1 计算二叉树最大的宽度 【数据结构】

二叉树的最大宽度是指二叉树所有层中结点个数的最大值。例如&#xff1a;下面二叉树的宽度为4. 输入二叉树的完全前序序列建立一棵二叉树&#xff08;上机作业2&#xff1a;二叉树的建立和遍历&#xff09;&#xff0c;编写算法计算并输出二叉树的宽度。 输入格式: 二叉树数据…

开源智能文档处理系统,助力医疗数据精准管理与高效整合

问题导向&#xff1a; 当前医疗文档中信息零散、数据整合度低&#xff0c;导致人工管理难度加大&#xff0c;错误率高。思通数科的系统在此背景下提供了免费的开源工具&#xff0c;帮助医疗机构实现数据的高效、精准管理&#xff0c;支持实时数据提取和智能管理。 客户案例&am…

STM32使用串口下载程序

STM32使用串口下载程序 FluMcu软件下载地址 单片机在线编程网 STM32 MCU启动模式配置(Boot Configuration) 单片机复位后&#xff0c;SYSCLK的第4个上升沿&#xff0c;BOOT引脚上的值将锁存&#xff0c;用户可以通过设置BOOT0和BOOT1引脚的值&#xff0c;来选择复位后的启动…

新兴斗篷cloak技术,你了解吗?

随着互联网技术的飞速发展&#xff0c;网络营销领域也经历了翻天覆地的变革。 从最早的网络横幅广告到如今主流的搜索引擎和社交媒体营销&#xff0c;广告形式变得越来越多样。 其中&#xff0c;搜索引擎广告一直以其精准投放而备受青睐&#xff0c;但近年来&#xff0c;一项名…

WPF+MVVM案例实战(十四)- 封装一个自定义消息弹窗控件(下)

文章目录 1、案例效果2、弹窗空间使用1.引入用户控件2、按钮命令实现 3、总结4、源代码获取 1、案例效果 2、弹窗空间使用 1.引入用户控件 打开 Wpf_Examples 项目&#xff0c;在引用中添加用户控件库&#xff0c;在 MainWindow.xaml 界面引用控件库&#xff0c;代码如下&…

教材管理系统设计与实现

教材管理系统设计与实现 1. 系统概述 教材管理系统是一个基于PHP和SQL的Web应用程序&#xff0c;旨在为学校提供一个高效的教材管理平台。该系统可以帮助管理员录入教材信息、教师查询和申请教材、学生查询教材信息&#xff0c;提高教材管理的效率和透明度。 2. 技术栈 前端…

【时间序列分析】平稳时间序列分析——Wold分解定理和延迟算子

Wold分解定理 &#xff08;这个定理是平稳时间序列分析的理论基石。&#xff09; 对于任意一个离散平稳时间序列, 它都可以分解为两个不相关的平稳序列之和, 其中一个为确定性的 (deterministic), 另一个为随机性的(stochastic) xₜVₜξₜ&#xff0c;{V₁} 为确定性平稳序列…

基于SpringBoot的汽车配件销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

数图携手黄商集团,打造品类空间精细化管理体系!

数图合作伙伴又1 在这秋高气爽的时节&#xff0c;满怀激情地传递着喜人的消息&#xff1a;数图的合作伙伴队伍再次壮大。位于湖北黄冈的黄商集团&#xff0c;勇于拥抱时代发展的数字变革潮流&#xff0c;积极致力于探索精细化的品类空间管理之道&#xff0c;一步一个脚印&…

大模型日报|3 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.SocialGPT&#xff1a;贪婪分段提示优化实现社会关系推理 社会关系推理旨在从图像中识别朋友、配偶和同事等关系类别。虽然目前的方法采用了使用标注图像数据端到端训练专用网络的模式&#xff0c;但这些方法在通用…

Unity计算二维向量夹角余弦值和正弦值的优化方法参考

如果不考虑优化问题&#xff0c;计算两个向量的余弦值或者正弦值可以直接使用类似的方法&#xff1a; [SerializeField] Vector2 v1, v2;void Start() {float valCos Mathf.Acos(Vector2.SignedAngle(v1, v2));float valSin Mathf.Asin(Vector2.SignedAngle(v1, v2)); } 但是…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

Spring Boot框架:校园社团信息管理的现代化解决方案

3系统分析 3.1可行性分析 通过对本校园社团信息管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本校园社团信息管理系统采用SSM框架&#xff0c;JAVA作…

基于SpringBoot+Vue的前后端分离的大学自动排课系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 在这个背景下&#xf…