leetcode 递归(回溯)——java实现

递归算法与DFS类似,也与二叉树的先序遍历类似

以下摘自 leetcode回溯算法入门级详解

回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。

  1. 搜索与遍历:
    我们每天使用的搜索引擎帮助我们在庞大的互联网上搜索信息。搜索引擎的「搜索」和「回溯搜索」算法里「搜索」的意思是一样的。
    搜索问题的解,可以通过 遍历 实现。所以很多教程把回溯算法称为爆搜(暴力解法)。因此回溯算法用于 搜索一个问题的所有的解 ,通过深度优先遍历的思想实现。

  2. 与动态规划的区别:
    共同点:用于求解多阶段决策问题。多阶段决策问题即:求解一个问题分为很多步骤(阶段);每一个步骤(阶段)可以有多种选择。
    不同点:动态规划只需要求我们评估最优解是多少,最优解对应的具体解是什么并不要求。因此很适合应用于评估一个方案的效果
    回溯算法可以搜索得到所有的方案(当然包括最优解),但是本质上它是一种遍历算法,时间复杂度很高。

总结:
做题的时候,建议 先画树形图 ,画图能帮助我们想清楚递归结构,想清楚如何剪枝。拿题目中的示例,想一想人是怎么做的,一般这样下来,这棵递归树都不难画出。
在这里插入图片描述
说明:

每一个结点表示了求解全排列问题的不同的阶段,这些阶段通过变量的「不同的值」体现,这些变量的不同的值,称之为**「状态」
使用深度优先遍历有「回头」的过程,在「回头」以后, 状态变量需要设置成为和先前一样 ,因此在回到上一层结点的过程中,需要撤销上一次的选择,这个操作称之为
「状态重置」
深度优先遍历,借助系统栈空间,保存所需要的状态变量,在编码中只需要注意遍历到相应的结点的时候,状态变量的值是正确的,具体的做法是:往下走一层的时候,path 变量在尾部追加,而往回走的时候,需要撤销上一次的选择,也是在尾部操作,因此 path 变量是一个栈;
深度优先遍历通过「回溯」操作,实现了
全局使用一份状态变量**的效果。
使用编程的方法得到全排列,就是在这样的一个树形结构中完成 遍历,从树的根结点到叶子结点形成的路径就是其中一个全排列。

总结一下回溯dfs的一般写法:

void dfs(int index,path..){if(index==n){res.add(new String(path));//终止条件return;}//接下来就是列出当前这一步里可走的选择范围for(int i=0;i<n;i++){有的是整个数组范围,有的是特定范围,有的是选与不选的//剪枝,增加一些条件限制比如//有顺序要求if(vis[i]||((i-1)>=0&&nums[i]==nums[i-1]&&!vis[i-1])) continue;//剪枝path.add//添加到路径中dfs//递归path.remove//移除添加,回归原本状态}
}

46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:

输入:nums = [1]
输出:[[1]]

以前我做这题时用的方法:

class Solution {List<List<Integer>> list = new ArrayList<List<Integer>>();void qp(List<Integer> a,int k,int m){ //k:当前位置 m:最后一个位置if(k>m){list.add(new ArrayList<Integer>(a));//新创建个list,拷贝a里的值,然后在add到list里}else{for(int i=k;i<=m;i++){//t=a[k];a[k]=a[i];a[i]=t;Collections.swap(a,k,i);qp(a,k+1,m);//t=a[k];a[k]=a[i];a[i]=t;Collections.swap(a,k,i);}}}public List<List<Integer>> permute(int[] nums) {int n=nums.length;List<Integer> a = new ArrayList<Integer>();for(int i=0;i<n;i++){a.add(nums[i]);}qp(a,0,n-1);return list;}
}

按照递归的思想,做这题,代码如下:

class Solution {List<List<Integer>> res = new ArrayList<List<Integer>>();//与图的dfs遍历很像int n;void dfs(int depth,boolean[] vis,List<Integer> path,int[] nums){if(depth==n){res.add(new ArrayList<Integer>(path));return;}for(int i=0;i<n;i++){if(!vis[i]){//nums数组里的数还没用过vis[i]=true;path.add(nums[i]);//记录经过的点dfs(depth+1,vis,path,nums);//状态回溯vis[i]=false;path.remove(depth);}}}public List<List<Integer>> permute(int[] nums) {n=nums.length;if(n==0) return res;List<Integer> path = new ArrayList<Integer>();boolean[] vis=new boolean[n];dfs(0,vis,path,nums);return res;}
}

47. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

添加剪枝条件:为了控制不重复,我们强制规定相同数字的顺序,即当nums[i]=nums[i-1]时,只有前一个被访问后一个相同点才能被访问【这么个顺序】(即:nums[i-1]被访问过才允许走nums[i])

class Solution {int n;List<List<Integer>> res = new ArrayList<List<Integer>>();public List<List<Integer>> permuteUnique(int[] nums) {//先排个序,让重复数字相邻//为了控制不重复,我们强制规定相同数字的顺序,即当nums[i]=nums[i-1]只有nums[i-1]被访问过才允许走nums[i]Arrays.sort(nums);n=nums.length;List<Integer> path = new ArrayList<Integer>();boolean[] vis = new boolean[n];dfs(0,vis,path,nums);return res;}void dfs(int depth,boolean[] vis,List<Integer> path,int[] nums){if(depth==n){res.add(new ArrayList<Integer>(path));return;}for(int i=0;i<n;i++){if(vis[i]||((i-1)>=0&&nums[i]==nums[i-1]&&!vis[i-1])) continue;//剪枝else{vis[i]=true;path.add(nums[i]);dfs(depth+1,vis,path,nums);//状态回溯vis[i]=false;path.remove(depth);}}}
}

78. 子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]

方法一:递归
在这里插入图片描述
以第三步,i=3时为例,将nums[i]与result数组前面的子集组合

class Solution {int n;        public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>();res.add(new ArrayList<Integer>());//先添加一个空的进去n=nums.length;for(int i=0;i<n;i++){int m=res.size();for(int j=0;j<m;j++){ArrayList<Integer> temp = new ArrayList<Integer>(res.get(j));temp.add(nums[i]);res.add(temp);}}return res;}
}

方法二:回溯
关键在于:每个点是选或不选两个状态
全排列那个题,每个点事可以在n个点中选,所以有个for循环

class Solution {int n;        List<List<Integer>> res = new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] nums) {//1.回溯方法:重点在于每个点都有选与不选两个状态//之前的depth代表小list中的位置(这个位置上的元素可以从nums数组中全取一遍),而这里代表走nums的哪了(只能往后取)//2.迭代递归n=nums.length;ArrayList<Integer> path = new ArrayList<Integer>();dfs(0,path,nums);return res;}void dfs(int index,ArrayList<Integer> path,int[] nums){if(index==n){res.add(new ArrayList<Integer>(path));return;}path.add(nums[index]);dfs(index+1,path,nums);path.remove(path.size()-1);//移除最后一个dfs(index+1,path,nums);}
}

90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的
子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[[1,2,2],[1,2],[1],[2,2],[2],[]]
示例 2:
输入:nums = [0]
输出:[[0],[]]
示例 3:
输入:nums = [1,1,1,1]
输出:[[1,1,1,1],[1,1,1],[1,1],[1],[]]

和上面全排列2题一样,控制一下重复字符的顺序。
关键在于:在顺序上,相同元素除了必须一起出现外,还可以一起不出现。

class Solution {int n;        List<List<Integer>> res = new ArrayList<List<Integer>>();public List<List<Integer>> subsetsWithDup(int[] nums) {//固定重复字符的前后顺序n=nums.length;Arrays.sort(nums);//排序,让相同元素挨着ArrayList<Integer> path = new ArrayList<Integer>();boolean[] vis = new boolean[n];dfs(0,path,vis,nums);return res;}void dfs(int index,ArrayList<Integer> path,boolean[] vis,int[] nums){if(index==n){res.add(new ArrayList<Integer>(path));return ;}if(index-1>=0&&nums[index]==nums[index-1]&&!vis[index-1]){//两者同时存在或同时不存在vis[index]=false;dfs(index+1,path,vis,nums);return;}path.add(nums[index]);vis[index]=true;dfs(index+1,path,vis,nums);path.remove(path.size()-1);vis[index]=false;dfs(index+1,path,vis,nums);}
}

39. 组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
示例 2:
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:
输入: candidates = [2], target = 1
输出: []

一开始直接用上述类型题的思想去做,运行后发现没去重,用index标记到数组那个位置了,再从哪个位置往后找。

class Solution {List<List<Integer>> res = new ArrayList<List<Integer>>();int n;public List<List<Integer>> combinationSum(int[] candidates, int target) {n=candidates.length;ArrayList<Integer> path = new ArrayList<Integer>();dfs(0,0,path,candidates,target);return res;}void dfs(int sum,int index,ArrayList<Integer> path,int[] candidates,int target){if(sum==target){res.add(new ArrayList<Integer>(path));return ;}if(sum>target) return ;for(int i=index;i<n;i++){path.add(candidates[i]);int m=sum+candidates[i];dfs(m,i,path,candidates,target);path.remove(path.size()-1);}}}

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]

class Solution {List<String> res = new ArrayList<String>();public List<String> letterCombinations(String digits) {HashMap<Integer,String> map = new HashMap<Integer,String>();map.put(2,"abc");map.put(3,"def");map.put(4,"ghi");map.put(5,"jkl");map.put(6,"mno");map.put(7,"pqrs");map.put(8,"tuv");map.put(9,"wxyz");StringBuilder path = new StringBuilder();if(digits.length()==0) return res;dfs(0,path,digits.length(),map,digits);return res;}void dfs(int index,StringBuilder path,int n,HashMap<Integer,String> map,String digits){if(index==n){//终止条件res.add(new String(path));return;}//接下来就是列出当前这一步里可走的范围String str=map.get(digits.charAt(index)-'0');//把拿到的字符变成数字for(int i=0;i<str.length();i++){//数字对应的一串字母path.append(str.charAt(i));dfs(index+1,path,n,map,digits);path.deleteCharAt(path.length()-1);} }
}

131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]
示例 2:
输入:s = “a”
输出:[[“a”]]

class Solution {List<List<String>> res = new ArrayList<List<String>>();public List<List<String>> partition(String s) {ArrayList<String> path = new ArrayList<String>();dfs(0,path,s);return res;}boolean huiwen(String str){//判断回文StringBuilder sb = new StringBuilder(str);if(str.equals(sb.reverse().toString())) return true;else return false;}void dfs(int index,ArrayList<String> path,String s){if(index==s.length()){res.add(new ArrayList<String>(path));return;}for(int i=index;i<s.length();i++){String str1 = s.substring(index,i+1);if(!huiwen(str1)) continue;path.add(str1);String str2 = s.substring(i+1,s.length());//左闭右开dfs(index+str1.length(),path,s);//加上前半段的长度path.remove(path.size()-1);}}
}

22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]

class Solution {String str="()";List<String> res = new ArrayList<String>();public List<String> generateParenthesis(int n) {//()(())          )())不行也就是说有括号必须在左括号后出现StringBuilder path = new StringBuilder();dfs(path,0,0,n);return res;}void dfs(StringBuilder path,int left,int right,int n){//left用来计左括号的数量if(left==n&&right==n){res.add(new String(path));return ;}//两种选择,这个和 78 子集那题类似for(int i=0;i<2;i++){if(right>left) continue;//右括号数量比左括号多if(left>n||right>n) continue;if(i==1){path.append(")");dfs(path,left,right+1,n);path.deleteCharAt(path.length()-1);}if(i==0){path.append("(");dfs(path,left+1,right,n);path.deleteCharAt(path.length()-1);}  }}
}

51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[[“Q”]]

class Solution {List<List<String>> res = new ArrayList<List<String>>();public List<List<String>> solveNQueens(int n) {int[] rowy= new int[n];//记录每个行中Q的所在列dfs(0,n,rowy);return res;}boolean fun(int[] rowy,int x,int y){//判断是否符合皇后限制for(int i=0;i<x;i++){if(rowy[i]==y||Math.abs(x-i)==Math.abs(y-rowy[i]))return false;}return true;}void dfs(int index,int n,int[] rowy){if(index==n){//已知rowy里存着每行中Q点位置,把图画出来List<String> path = new ArrayList<String>();for(int i=0;i<n;i++){char[] str = new char[n];Arrays.fill(str,'.');str[rowy[i]]='Q';path.add(new String(str));}res.add(new ArrayList<String>(path));return;}for(int i=0;i<n;i++){if(!fun(rowy,index,i)) continue;//剪枝rowy[index]=i;dfs(index+1,n,rowy);rowy[index]=0;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL笔记01: MySQL入门_1.2 MySQL下载安装与配置

2.2 MySQL下载安装与配置 2.2.1 MySQL下载 MySQL中文官网&#xff1a;https://www.mysql.com/cn/ MySQL英文官网&#xff1a;https://www.mysql.com/ MySQL官网下载地址&#xff1a;https://www.mysql.com/downloads/ &#xff08;1&#xff09;点击“MySQL Community (GPL) Do…

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

从力扣中等+困难题+表白HTML测试 -- 文心快码(Baidu Comate)

0 写在前面 &#xff08;通过如下链接/二维码进入官网注册&#xff0c;并在IDE使用三次及以上可以找我领计算机基础/ML/DL 面经/知识点一份~&#xff09; 官网地址&#xff1a;Baidu Comate Step1 打开文心快码&#xff08;Baidu Comate&#xff09;官网&#xff0c;点击「免…

[Python可视化]空气污染物浓度地图可视化

[Python可视化]空气污染物浓度地图可视化&#xff0c;果然是路边浓度最大 在本篇文章中&#xff0c;我将展示如何使用 Python 结合 OSMnx、NetworkX 和 GeoPandas 等库&#xff0c;计算给定路径的最短路线&#xff0c;并基于该路径穿过的网格单元计算总污染量。最终&#xff0c…

k8s - Secret实践练习

参考文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ 这个和ConfigMap很相似&#xff0c;这里选两个做下测试&#xff0c;就不过多赘述了 简介 Secret 类似于 ConfigMap 但专门用于保存机密数据。 Secret 是一种包含少量敏感信息例如密码…

<数据集>鸟类识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;16287张 标注数量(xml文件个数)&#xff1a;16287 标注数量(txt文件个数)&#xff1a;16287 标注类别数&#xff1a;10 标注类别名称&#xff1a;[Chestnut Munia, Zebra Dove, Garden Sunbird, Collared Kingfish…

Qt第十八章 XML和Json格式解析

文章目录 JSON格式解析Json生成案例 XML简介与HTML的区别格式XML解析流的方式DOM XML生成 JSON与XML的区别比较 JSON 格式 JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名 六个构造字符 开始和结束数组&#xff1a;[ ]开始和结束对象&#x…

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现&#xff08;一&#xff09; 本系统是简易的宠物收养系统&#xff0c;为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现&#xff08;组件导航使用&#xff09; 官方文档&#xff1a;组…

机器学习辅助复合材料预测,性能管理优化创新材料,这种王炸般的组合,还真是大开眼界!

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能力…

Eureka 原理与实践全攻略

一、Eureka 概述 Eureka 在微服务架构中具有举足轻重的地位。它作为服务注册与发现的核心组件&#xff0c;为分布式系统中的服务管理提供了关键支持。 Eureka 的主要功能包括服务注册、服务发现、服务健康监测和自我保护机制。服务注册功能使得服务提供者能够在启动时将自身的…

git-版本管理工具基本操作-创建仓库-拉取-推送-暂存库-版本库

1、创建仓库和版本说明 2、克隆仓库到本地&#xff08;首次拉取需要输入用户名和密码&#xff0c;用户名用邮箱&#xff0c;密码用登录gitee的密码&#xff0c;后面配置密钥后可以直接clone&#xff09; 在命令行输出两行指令配置git才能克隆&#xff1a; username&#xff1…

《Web项目跨域请求后端Api设置Cookie失败问题?》

问题描述&#xff1a; 在web项目中跨域请求api时&#xff0c;api登录成功后需要向域名中设置cookie实现在两个域名下共享&#xff0c;但是登录接口返回成功&#xff0c;响应头中也有set-cookie&#xff0c;实际却无法设置到cookie中… web项目访问时的域名https://b.com/ api所…

解锁Spring Boot、Prometheus与Grafana三合一:打造你的专属自定义指标炫酷大屏!

1. 集成Prometheus到Spring Boot 需要在Spring Boot应用中集成Prometheus。可以通过micrometer库来实现。micrometer是一个应用程序监控库&#xff0c;它支持多种监控系统&#xff0c;包括Prometheus。 一招制胜&#xff01;Spring Boot、Prometheus和Grafana三剑合璧&#x…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…

【Redis】基本全局命令

Redis的基本全局命令 keysexistsdelexpirettltype Redis 有 5 种数据结构&#xff0c;但它们都是键值对种的值&#xff0c;对于键来说有⼀些通⽤的命令。 keys 返回所有满足样式 &#xff08;pattern&#xff09;的key。支持如下统配样式。 h?llo 匹配 hello , hallo 和 hxl…

培训班和科班出生有什么区别

IT业的萌新来啦 每到毕业季 总有大量萌新走进职场 IT圈子的程序员 有的是科班出生 比如 计算机科学与技术、软件工程、大数据技术 有的是相关专业出生的 比如 信息安全、网络工程、物联网工程等等 除此之外 还有各种其他专业转行过来的 文理不限、专业不限 科班出生…

【在Linux世界中追寻伟大的One Piece】IO基础

目录 1 -> 回顾 1.1 -> 回顾C文件接口 1.2 -> 总结 2 -> 系统文件I/O 3 -> 接口介绍 3.1 -> open 3.2 -> open函数返回值 3.3 -> 文件描述符fd 4 -> 0 & 1 & 2 5 -> 文件描述符的分配规则 6 -> 重定向 7 -> 使用dup2系…

运维开发——局域网SSH访问服务器与应用

摘要 本博文主要介绍局域网SSH访问登陆虚拟机和及其应用相关配置操作。 1. 局域网SSH访问登陆虚拟机 目标&#xff1a;在局域网内A电脑使用SSH登陆B电脑上虚拟机的服务器。 前提条件:B电脑为宿主机&#xff0c;可以正常使用ssh访问虚拟机服务器&#xff0c;虚拟机网络连接方…

深度学习基础—超参数调试

1.超参数调试顺序 在训练深度网络最难的事情之一是超参数的选择&#xff0c;如何选择合适的超参数取值&#xff1f;下面我将谈谈&#xff0c;如下是我所理解的超参数调试顺序&#xff1a; 重要性排序 超参数 Top1梯队 学习率a Top2梯队 min-batch大小&#xff0c;隐层神经…

QT-五子棋游戏

QT-五子棋游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "GameModel.h" #include <time.h> #include <stdlib.h>GameModel::GameModel(){}void GameModel::startGame(GameType type){gameType type;//初始化棋盤game…