算法
青梅煮酒论英雄
你以为的你以为的就是你以为的吗
展开
-
回溯,深度遍历---单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED", 返回 true给定 word = "SEE", 返回 true给定 word = "ABCB", 返回原创 2021-02-22 21:04:38 · 89 阅读 · 0 评论 -
最长回文子串-----二维数组
思路如果 i-j 是回文子串,那么i+1-----j-1 也是回文子串定义一个二维数组,每一项代表 是否是回文子串小tips: Array.from 可以用来拷贝数组Array.from(new Array(9),() => new Array(9).fill(0)) new Array(9).fill(new Array(9).fill(0))两者不相等function longestPalindrome (string) { let length = string.lengt原创 2020-12-14 19:59:47 · 185 阅读 · 0 评论 -
二分法查找---logn复杂度
数据量越多,查找的越快1. 对于一个有序的数组,找到target第一次出现和最后一次的索引值,时间复杂度为logn思路: 1. 找到左半部分第一次等于target的值2. 找到右半部分第一次大于taget的索引值 减一function search (nums, target) { let findIndex = (nums, target, isSearchLeft) => { let left = 0, right = nums.length - 1, result = num原创 2020-12-01 21:38:35 · 557 阅读 · 0 评论 -
LFU 缓存算法-----链表
Least Ffequently User最少使用缓存的 算法思路 O(1):利用双向链表数据结果实现新增删除利用map来读取存储数值及频率的次数首先明确,我们要对外暴露两个方法,get 和 set因为get和set的调用要更新次数以及缓存数据的存储,所以要实现一个私有方法 _updateget 函数比较简单,如果存储的数据中有值的话,直接读取,并且更新使用的次数频率,否则返回 -1;set 函数 分两种情况,如果存储的数据中有值的话,更新值,并且更新使用的次数频率。 如果没有值,原创 2020-11-28 16:58:15 · 144 阅读 · 0 评论 -
js 数组转成二叉树(递归)
判断终止条件。 leng === 1 return this.value = value取中间mid先定义一个root = arr[mid];root.left 递归左半部分root.right 递归右半部分返回rootfunction sortedArrayToBST (arr) { if (!arr.length) { return null; } if (arr.length === 1) { return arr[0]; } let mid = parseIn.原创 2020-11-19 21:20:21 · 2278 阅读 · 2 评论 -
深度优先遍历及广度优先遍历
深度优先遍历 Depth-First-Search(DFS)自上而下的遍历搜索 (时间比广度要长,但是空间更少)堆栈的形式, 即先进后出广度优先遍历 Breadth-First-Search (BFS)广度优先逐层遍历 (时间比深度要短,但是花费的空间更大)队列的形式, 即先进先出两者差别深度优先不需要记住所有的节点, 所以占用空间小, 而广度优先需要先记录所有的节点占用空间大深度优先有回溯的操作(没有路走了需要回头)所以相对而言时间会长一点代码实现const data = [原创 2020-11-17 21:17:35 · 383 阅读 · 1 评论 -
十大排序(一)冒泡、选择、快排和插入
冒泡排序让数组的当前项与后一项作比较,如果当前项大于后一项,则交换位置最多比较length - 1轮,每一轮最多比较 length - 1 - i 次, 每次比较一轮的时候都能得到最大的放到后面function bubbleSort (arr) { for (let i =0; i< arr.length -1) { for (let j = i; j++; j < arr.length -1 - i) { if (arr[j] > arr[j+1]) {原创 2020-11-16 22:12:52 · 55 阅读 · 0 评论 -
RSA算法(二)
号称世界上最重要的加密算法生成步骤甲要向乙进行通信,要生成私钥和公钥一. 甲方随机生成两个质数a (61), b(53),实际上质数越大,就越难破解二. 计算 a和b的乘积 nn的长度就是秘钥的长度,n = 61×53 = 3233, 写成二进制是110010100001,一共有12位,所以这个密钥就是12位,实际应用中,RSA密钥一般是1024位,重要场合则为2048位三、计算n的欧拉函数φ(n) —φ(n) = (p-1)(q-1)φ(3233)等于60×52,即3120四、随机原创 2020-11-13 11:01:40 · 137 阅读 · 0 评论 -
RSA算法(一)
对称加密算法加密和解密都是使用同一种规则这样存在的问题: 甲方必须把加密的规则告诉乙方,否则无法解密,这样保存和传递秘钥就很可能存在安全问题非对称加密算法乙方生成两把秘钥(公钥和私钥),公钥是公开的,任何人都可以获得,私钥是保密的甲方获取乙方的公钥,对它进行加密乙方得到加密的信息后,用私钥解密RSA算法就是著名的非对称加密算法,密码长度越长越容易被破解互斥欧拉函数模反...原创 2020-11-12 21:29:52 · 146 阅读 · 0 评论 -
下一个全排列
比当前的大(大的幅度要尽可能小),如果当前是降序排列(最大),要转换成升序排列(大的幅度要尽可能小)eg: 【1,2,3】=> [1, 3, 2]eg: 从最后一项 [1, 2, 3, 4, 6, 5] => [1,2,3,5,4,6]思路: 1. 从最后一项开始找升序, 如果找到当前值 i2. 从最后一项寻求第一个比他大的数,并且与它交换3. i后面的所有值按照降序排列let getNextList = (nums) => { let i = nums.length -原创 2020-11-12 10:36:51 · 60 阅读 · 0 评论 -
贪心算法---解决整数转换成罗马数字
定义总是对局部做出最优解,而不是整体考虑最优解思路1.建立数学模型2.把每个问题分成若干个子问题3.对子问题进行求解4.把子问题局部最优解合成原来问题的一个解特性有一个候选的集合,比如硬币, 罗马数字集合随着算法的进行,将积累起其他两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优例子罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。原创 2020-11-07 15:35:27 · 122 阅读 · 0 评论 -
回溯算法-------解决数独问题
回溯算法 类似尝试枚举的搜索方式,当找到不符合条件的解时候,就回溯返回,尝试别的路径常用步骤开头写好条件,满足条件才加入总结果中已经拿过的数不再拿向下遍历,进行回溯function def (aray) { if () { //满足条件add进去 return; } for( item in array) { if () { //去掉已经拿过的数 continue; } 满足条件干什么 add def () // 向下原创 2020-11-04 14:32:57 · 741 阅读 · 0 评论