热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript数据结构与算法基础

-栈1.栈的应用场景场景一:十进制转二进制后出来的余数反而要排到前面把余数依次入栈,就可以实现倒序输出场景二:有效的括号越靠前的左

image-20211010152904271.png

  • 定义子问题:F(n) = F(n - 1) + F(n - 2)
  • 反复执行:从2循环到n,执行上述公式。

2. 爬楼梯问题


题目链接:70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

思路:

  • 爬到第n阶可以在第n-1阶爬1个台阶,或者在第n-2阶爬2个台阶。
  • F(n) = F(n-1) + F(n-2)
  • 使用动态规划。

解题步骤:70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

  • 定义子问题:F(n) = F(n-1) + F(n-2)
  • 反复执行:从2循环到n,执行上述公式。

var climbStairs &#61; function(n) {if(n <2) return 1;const dp &#61; [1,1];for(let i &#61; 2;i <&#61; n;i&#43;&#43;){dp[i] &#61; dp[i - 1] &#43; dp[i - 2]}return dp[n]
};
// 时间复杂度O(n) 临时变量数组空间复杂度O(n)//空数组改为两个变量,将空间复杂度下降至O(1)
var climbStairs &#61; function(n) {if(n <2) return 1;let dp0 &#61; 1;let dp1 &#61; 1;for(let i &#61; 2;i <&#61; n;i&#43;&#43;){const temp &#61; dp0;dp0 &#61; dp1;dp1 &#61; dp0 &#43; temp;}return dp1
};

3. 打家劫舍


题目链接:198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com)

思路:

  • f(k) &#61; 从前K个房屋中能窃取的最大数额。

  • Ak &#61; 第k个房屋的钱数。

  • f(k) &#61; max(f(k-2)&#43;Ak,f(k-1))。

  • 考虑动态规划

解题步骤&#xff1a;

  • 定义子问题&#xff1a;f(k) &#61; max(f(k-2)&#43;Ak,f(k-1))。
  • 反复执行&#xff1a;从2循环到n&#xff0c;执行上述公式。

var rob &#61; function(nums) {if(nums.length &#61;&#61;&#61; 0) return 0const dp &#61; [0,nums[0]];for(let i &#61;2;i<&#61;nums.length;i&#43;&#43;){dp[i] &#61; Math.max(dp[i-2] &#43; nums[i - 1],dp[i - 1])}return dp[dp.length - 1]
};

- 贪心算法


1. 贪心算法是什么&#xff1f;


  • 贪心算法是算法设计中的一种方法。
  • 期盼通过每个阶段的局部最优选择&#xff0c;从而达到全局的最优。
  • 结果并不一定是最优

2. 零钱兑换


题目链接&#xff1a;455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com)

思路&#xff1a;

  • 局部最优&#xff1a;既能满足孩子&#xff0c;还消耗最小。
  • 先将“较小的饼干”分给“胃口最小”的孩子。

解题步骤&#xff1a;

  • 对饼干数组和胃口数组升序排序。
  • 遍历饼干数组&#xff0c;找到能满足第一个孩子的饼干
  • 然后继续遍历饼干&#xff0c;找到满足第二、三、.....、n个孩子的饼干。

var findContentChildren &#61; function(g, s) {const sortFunc &#61; function(a,b) {return a -b}g.sort(sortFunc);s.sort(sortFunc);let i &#61; 0;s.forEach(n &#61;> {if(n >&#61; g[i]){i&#43;&#43;}})return i;
};

3. 买股票问题


题目链接&#xff1a;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com)

思路&#xff1a;

  • 前提&#xff1a;上帝视角&#xff0c;知道未来的价格。
  • 局部最优&#xff1a;见好就收&#xff0c;见差不动&#xff0c;不做任何长远打算

解题步骤&#xff1a;

  • 新建一个变量&#xff0c;用来统计总利润。
  • 遍历价格数组&#xff0c;如果当前价格

var maxProfit &#61; function(prices) {let profit &#61; 0;for(let i &#61;1;i prices[i - 1]){profit &#43;&#61; prices[i] - prices[i - 1];}}return profit
};

- 回溯算法


1. 回溯算法是什么


  • 回溯算法是算法设计的一种方法。
  • 回溯算法是一种渐进式寻找构建问题解决的策略。
  • 回溯算法会先从一个可能的动作开始解问题&#xff0c;如果不行&#xff0c;就回溯并选择另一个动作&#xff0c;直到问题解决。

2. 什么问题适合回溯算法解决&#xff1f;


  • 有很多路。
  • 这些路里&#xff0c;有死路,也有出路
  • 通常需要递归模拟所有的路。

3. 全排列


  • 用递归模拟出所有的情况。
  • 遇到包含重复元素的情况&#xff0c;就回溯
  • 收集所有到达递归终点的情况&#xff0c;就返回

题目链接&#xff1a;46. 全排列 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com)

思路&#xff1a;

  • 要求&#xff1a;1、所有排列情况 2、没有重复元素
  • 有出路、有死路
  • 考虑回溯算法

解题步骤&#xff1a;

  • 有递归模拟所有的情况。
  • 遇到包含重复元素的情况&#xff0c;就回溯。
  • 收集所有到达递归的情况&#xff0c;并返回

var permute &#61; function(nums) {const res &#61; [];const backtrack &#61; (path) &#61;>{ //返回函数if(path.length &#61;&#61;&#61; nums.length){ // 长度相等就返回res.push(path);return;}nums.forEach(n &#61;> {if(path.includes(n)){ // 不能包含一模一样的数字return;}backtrack(path.concat(n));})}backtrack([])return res;
};
// 时间复杂度O(n!) 空间复杂度O(n)

4. 子集问题


题目链接&#xff1a;78. 子集 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com)

思路:

  • 要求&#xff1a;1、所有子集&#xff1b;2、没有重复元素
  • 有出路、有死路。
  • 考虑使用回溯算法。

解题步骤&#xff1a;

  • 用递归模拟出所有情况
  • 保证接的数字都是后面的数字。
  • 收集所有到达递归终点的情况&#xff0c;并返回。

var subsets &#61; function(nums) {const res &#61;[]const backtrack &#61; (path,l,start) &#61;>{if(path.length &#61;&#61;&#61; l){res.push(path)return;} for(let i &#61; start;i};

- 完结


- 知识体系结构


  • 数据结构&#xff1a;栈、队列、链表、集合、字典、树、图、堆。
  • 算法&#xff1a;链表/树/图的遍历、数组的排序和搜索
  • 算法设计思想&#xff1a;分而治之、动态规划、贪心、回溯。

- 重点难点


  • 数据结构&#xff1a;所有数据结构都很重要&#xff0c;跟前端最相关的是链表和树。
  • 算法&#xff1a;链表/树/图的遍历、数组的排序和搜索.....
  • 设计思想&#xff1a;分而治之、动态规划常考&#xff0c;贪心、回溯次之。

- 经验心得


  • 搞清楚数据结构与算法的特点应用场景
  • 用JS实现一遍&#xff0c;最好能用第二第三语言再实现一遍。
  • 学会分析时间/空间复杂度
  • 提炼前端和算法结合点&#xff0c;用于工作实战

- 拓展建议


  • 刷题&#xff0c;最好能保证300道以上。
  • 多总结各种套路模板
  • 多遇到源码&#xff0c;比如React、Lodash、V8......
  • 实战&#xff0c;将数据结构与算法用于工作。

推荐阅读
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 安装Tensorflow-GPU文档第一步:通过Anaconda安装python从这个链接https:www.anaconda.comdownload#window ... [详细]
  • ZendFrameworkZendFormElementTextareawithBBCodeandPHPC ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • 详解react组件通讯方式(多种)
    这篇文章主要介绍了详解react组件通讯方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • ReactJSUIAnt设计空组件原文:https://w ... [详细]
  • 这篇文章给大家讲解如何利用dhtmlxGantt在服务器端集成数据。脚本数据保存如果您已初始化dataProcessor,则用户或以编程方式所做的任何更改都将自动 ... [详细]
  • Error in nextTick: quot;TypeError: Cannot set property #39;xxx#39; of undefinedquot;解决办法
    vue项目在控制台中报这个错误时,当看到nextTick词时想到vue的$nextTick()方法Vue在更新DOM时是异步执行的。只要侦听到数据变化, ... [详细]
author-avatar
雷神鑫源义_341
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有