🥳前端算法面试之找到最短路径-每日一练

前言

今天分享的内容是常见的算法面试题--回溯算法之找出最短路径

假设 n*n 的方格,每个方格都有一个数字,表示这个方格的权重。现在要从(0,0)走到(n-1, n-1),有很多路径。就像下面这个九宫格,从左上角走到右下角,可以右右右下下下,也可以下下下右右右,也可以右右下下下右,有很多种走法,每种走法的权重都不一样,现在要找到权重之和最小的那条路径

这个问题要怎么解决?很简单,只要找到所有的路径,然后选出其中最短的路径就可以了。很好,那么要怎么找到所有的路径呢?

回溯算法

这就要请出今天的主角了--回溯算法

回溯算法是一种用于解决组合和排列问题的算法。它通过递归地尝试所有可能的组合或排列来找到解决方案。回溯算法通常用于求解具有多个变量或条件限制的组合或排列问题。

回溯算法的基本思想是:从问题的初始状态开始,逐个尝试每种可能的解,直到找到一个满足条件的解。对于本文的问题,回溯算法就可以尝试到每一种的走法。

对于其中某一格来说,走法之后两种,要么往右,要么往下。假设往右走了,那么面临的选择还是两种,要么往右,要么往下。走的过程中其实不需要管哪种走法最短,因为短不短的,一切等到了终点再说。

思路很简单,下面来看看代码:

代码实现

javascript 复制代码
const data = [
	[3, 4, 2, 1],
	[5, 2, 4, 1],
	[7, 6, 4, 3],
	[5, 9, 2, 4],
];
let minWeight = Infinity;
let n = data.length - 1;

const findShortPath = (data, i, j, weight) => {
	if (i == n && j == n) {
		if (weight < minWeight) minWeight = weight;
		return;
	}

	if (i < n) {
		findShortPath(data, i + 1, j, weight + data[i + 1][j]);
	}
	if (j < n) {
		findShortPath(data, i, j + 1, weight + data[i][j + 1]);
	}
};

首先,定义了一个名为data的二维数组,表示这是一个 4*4 的方格,data中包含4个数组,每个数组中包含4个权重

然后,定义了一个名为minWeight的变量,其初始值为Infinity,表示最短路径的权重。n的变量,其初始值为data.length - 1,表示能往一个方向走的最多步数。

在findShortPath函数中,我们首先检查i和j是否都等于n,表示已经到达底部点。如果是,我们检查当前路径的权重是否小于当前的最短路径权重,如果是,则更新minWeight。

如果没有走到底,就继续走,下面有两个递归调用的语句,分别表示往右走,或者往下走。

调用这个代码看看最短权重路径是多少

测试代码

javascript 复制代码
findShortPath(data, 0, 0, data[0][0]);

console.log('the min weight is: ',minWeight); //the min weight is:  18

上面的数据有些复杂,可以举几个简单的方格数据,方便大家看得更清楚:

例一

javascript 复制代码
const data = [
	[1, 2, 2],
	[1, 2, 2],
	[1, 1, 1],
];

打印结果:

例二

javascript 复制代码
const data = [
	[1, 2, 2],
	[1, 0, 2],
	[1, 0, 1],
];

打印结果:

代码正确🙆

总结

这篇分享了如何用回溯算法找到权重最短的路径,回溯算法的好处就可以方便地遍历所有的可能性,然后选出其中最合适的。因为每种可能性都要去计算,所以回溯算法的时间复杂度是 n^2. 之后讲到的动态规划,可以大幅度地减小回溯递归带来的复杂度的指数级增长,敬请期待吧

可以评论区留言哦。我每天都会分享一篇算法小练习,喜欢就点赞+关注吧

相关推荐
夕水24 分钟前
我用trae重构了ew-color-picker,一个插件化架构的现代颜色选择器
前端·javascript·开源
Penge66626 分钟前
React JSX 核心语法:从入门到业务开发实战
前端
zhanlang021733 分钟前
HTML 零基础入门到企业实战全套教程【第五章 5.5 综合案例:图文影音展示页面开发】
前端·html
时间的拾荒人1 小时前
Redis 哨兵(Sentinel)详解:原理、选举机制与实战部署
redis·面试·架构·sentinel
zhanlang02171 小时前
HTML 零基础入门到企业实战全套教程【连载 5.3】audio、video 音频视频标签|兼容格式、自动播放踩坑、企业规范
前端·html
nice_lcj5201 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
qq_406981032 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
zhanlang02172 小时前
HTML 零基础入门到企业实战【第五章 5.4】内嵌网页 iframe 标签:嵌入网页、视频、地图实战
前端·html·音视频
在所不辞兄2 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习