
算法基础
文章平均质量分 73
yangxinxiang84
这个作者很懒,什么都没留下…
展开
-
图解推导爬楼梯(跳台阶)问题详细过程
1,题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。,2,递推公式(状态转移方程)推导分析,需求比较简单。拿到这个题目的第一想法就是递归,但是这个递推公式是怎么得来的?我居然陷入了逻辑死胡同,花了很长时间才彻底绕出来了。不多说,先上图:图片链接:上楼梯(1次上1台或者2台)问题 | ProcessOn免费在线作图,在线流程图,在线思维导图 |认真的看上图,可以看出:上到原创 2021-11-11 23:06:32 · 4925 阅读 · 0 评论 -
动态规划思想解决找零问题,最精炼的实现(JavaScript版)
1,背景:十一节前练习了使用动态规划、回溯、贪心等算法实现找零问题:动态规划、回溯、贪心算法解找零问题(最小张数付款问题)(JavaScript实现)_yangxinxiang84的专栏-CSDN博客是实现出来了,也没有问题,但是总感觉使用动态规划实现的时候状态转移部分有点奇怪,有点复杂,理解上有一些困难。遂向大神川哥请教,大神就是大神,咔咔咔一会给我发了一个Java版本过来,当看到川哥的实现的代码的时候,我以为他理解错了(怀疑实现错了),因为代码确实太精炼了,居然没有用除法,没有用取模。。。原创 2021-10-11 15:41:28 · 1108 阅读 · 0 评论 -
动态规划、回溯、贪心算法解找零问题(最小张数付款问题)(JavaScript实现)
1,背景需求:我们有 3 种不同面值的硬币,11 元、5 元、1 元(一定会有),我们要支付 15 元(整数),最少需要 多少个硬币?最少要3 个硬币(3 个 5 元的硬币)。2,动态规划实现这个问题应该是满适合用动态规划解的:多阶段决策求最优解。思路:A),用硬币的面值划分阶段,每一个阶段(每种硬币值)都有两种情况:使用或者不使用该面值硬币。B),每决策完一次之后,都会产生一组状态:本次决策用了多少个硬币、一共现在用了多少个硬币、每种状态下还剩余多少钱。C),将各个阶段原创 2021-09-30 21:04:19 · 1828 阅读 · 0 评论 -
贪心、回溯、动态规划算法求“变形”杨辉三角的最短路径
1、背景需求:“杨辉三角”不知道你听说过吗?我们现在对它进行一些改造。每个位置的数字可以随意填写,经过某个数字只能到达下面一层相邻的两个数字。假设你站在第一层,往下移动,我们把移动到最底层所经过的所有数字之和,定义为路径的长度。请你编程求出从最高层移动到最底层的最短路径长度。咱们今天通过三种算法思想来解这个题:分别是回溯、动态回归、贪心等算法。这三种算法思想各有自己适应的场景,简要的说:贪心:一条路走到黑,就一次机会,只能哪边看着顺眼走哪边。不一定能求得满足要求的值。回溯:一.原创 2021-09-27 22:15:22 · 1061 阅读 · 0 评论 -
JavaScript实现归并排序算法并详解
归并排序是非常经典的基础排序之一,使用分治的思想,分而治之。先将待排序数组分拆为更小的数组,一直拆分到只有一个元素(只有一个元素的数组就是有序的),然后对分拆的数组按顺序进行合并。这个思想就是分而治之的思想,变成实现的时候,常用递归编程技巧来实现。直接上图来说这个过程(图是拷贝网上的):这里重点详细讲一下合并过程,合并被分解好的左右两部分的时候,左右两部分分别已经排好了,因此可以按如下图策略合并:比如需要合并left [1,5,6]的数组和right [2,3,4]数组的过程图:..原创 2021-08-30 20:16:00 · 993 阅读 · 0 评论 -
图解JavaScript单向循环链表及其反转实现
上一篇讲解分析了一下单向链表的反转实现。再看一下单向循环链表的反转。(高清图地址: https://www.processon.com/view/link/6121c41363768958e5302f6e)1,直观的看一下区别:先直观的看一下【单向链表】和【单向循环链表】的区别反转之后的指针(引用)指向:2,实现策略:2.1,从头节点开始遍历整个链表,直到找到尾节点。循环尾节点的判断是【尾节点】等于【头节点】 ,之前单向非循环链表的尾节点判断是节点的n...原创 2021-08-22 11:31:41 · 699 阅读 · 0 评论 -
图解ES6实现单向链表(添加)和反转功能
这几天在看算法基础,链表部分再练练手,单向链表的反转是一个比较考验思维缜密的技巧点。先在纸上画一下单向链表的结构,分析一下指向问题,基本得出解决思路(解决思路不复杂,但是要小心处理各个指针(引用)的指向关系):1,基本得出解决思路1,通过while循环遍历链表。2,每次遍历都要分析出三层节点关系:父节点、子节点,孙节点。每次遍历都将子节点的next指针(引用)指向父节点。3,遍历结束之后,获得当前链表的尾节点。4,修正头节点head的next指针为null,变为尾节点用。5,将头节点原创 2021-08-21 18:07:56 · 281 阅读 · 0 评论 -
小技巧:前端用不同的方式实现斐波那契 fibonacci数列
斐波那契fibonacci数列是经典的入门算法题,定义是:从第3项开始,前面相邻两项之和,构成了后一项。也就是,从第3项开始,每一项等于前面两项之和。从定义看,最直观的就是递归,走一版:版本1:/** * 计算斐波那契数列第n项的值 * @param {*} n * @returns 第n项的值 */function fibonacci(n){ if(n<=1) { return 1; } return fibonacci(n-...原创 2021-07-30 15:58:01 · 548 阅读 · 0 评论 -
用流程图详解插入排序原理和流程(JavaScript实现)
插入排序是一个基础排序算法,网上都说比较简单。但是我在彻底去理解它的过程和原理的时候,还是着实花了一些精力。把这个过程用一个流程图记录下来,方便自己和需要的伙伴阅读。一、核心思想插入排序的核心思想是,将待排数组抽象划分成两个区域,一个是有序区域,一个是无序区域。通过两层循环,逐一的将无序区域的内容,按顺序插入到有序区域。1,初始区域划分:第一个元素(index = 0)初始为有序区域,因为只有一个元素,不存在有序无序一说;从第二个元素(index = 1)往后算初始的无序区域2,外层循环作用原创 2020-12-28 09:57:14 · 5702 阅读 · 0 评论 -
用ES6的新特性实现斐波那契数列
斐波那契数列是每一门语言必讲的一个简单又经典的算法题,用ES6的新特性来实现,简单、清晰数列从第3项开始,每一项都等于前两项之和,比如:1、1、2、3、5、8、13、21、34直接撸代码:方案1,解构赋值的方式:function fib1(num){ let rst = []; let [pre, current] = [0,1]; if(num>=3){ for(let i=0; i<num; i++){ rs.原创 2020-06-01 22:47:30 · 482 阅读 · 0 评论 -
用流程图详细解释JavaScript冒泡排序原理和流程
冒泡排序很简单,两重循环即可。用一个图详细解释其冒泡原理。核心原理是:把每一个元素和数组中的每一个元素进行位置比较,如果满足移动的条件,相比较的两个元素交换位置(冒泡)先撸代码,代码简短:/** * 数组的冒泡排序 * @param {array} arr * @author xinxiang84@126.com */function bubbleSort(arr) {...原创 2020-05-03 00:32:38 · 2139 阅读 · 1 评论 -
一图解析JavaScript快速排序原理,看了就不会忘~~
今天有个朋友问快速排序的原理,用processon给他画了一个图,也顺手贴上来,给需要的朋友使用。快排的核心原理是:1,选数组中的中间数据为比较的基数 (其实选哪个都可以,选第一个或者最后一个都行)2,从头开始遍历数组,跟选出来的中间数进行比较,比中间数小的放左边数组,大的放右边数组3,此时得到leftArr数组、中间元素、右边数组4,分别对左边数组执行步骤1~3,直到拆不出数...原创 2020-05-02 22:32:37 · 896 阅读 · 0 评论