算法
栗子好好吃
向来心是看客心,奈何人是剧中人
展开
-
【算法】大根堆
【代码】【算法】大根堆。原创 2022-09-07 10:53:04 · 388 阅读 · 1 评论 -
【算法小积累】 - 提取非0数最右侧的1
参考 - 69:49const getRightOne = num => { return num & (~num + 1);};原创 2021-03-30 17:33:52 · 178 阅读 · 0 评论 -
【异或运算】 - 交换2个数
1. 代码let a = 3; let b = 4;a = a ^ b;b = a ^ b;a = a ^ b;2. 异或的性质不同为1,相同为0(可以看做是无进制位的加法)交换律: a ^ b = b ^ a;结合律: (a ^ b) ^ c = a ^ (b ^ a);0 ^ x = x;x ^ x = 0;3. 证明下面证明1中的代码a = 3 ^ 4;b = (3 ^ 4) ^ 4 = 3 ^ 0 = 3;a = (3 ^ 4) ^ 3 = 4 ^ 0 = 4原创 2021-03-30 11:52:53 · 137 阅读 · 0 评论 -
【算法】 - 动态规划 + 位运算
题目描述思路1:写一个返回2进制中1数量的函数countOne遍历0到num,对每一个数使用countOne,并将结果保存到res中返回var countBits = function (num) { let res = new Array(num + 1).fill(0); for (let i = 0; i <= num; i++) { res[i] = countOne(i.toString(2)); } return res;};原创 2021-03-03 09:47:12 · 173 阅读 · 0 评论 -
【算法】 - 滑动窗口
1. 题目链接2. 分析最多可以将K个值从0变成1,因此滑动窗口的限制条件: 0的数量(zeros)小于K,算法过程如下有一个滑动窗口(slipper),每次都会从A中读入一个数当读入的数为0时,zeros++当zeros的数量大于K时,会取出slipper首部的元素,当取值为0时zeros--总体代码如下:var longestOnes = function (A, K) { let slipper = []; let len = A.length; let r原创 2021-02-25 10:37:16 · 127 阅读 · 0 评论 -
算法 --- > 记一道面试dp算法题
题目: 给定一个数组(长度大于1),如下let a = [1,4,3,4,5] // 长度不确定,数值为整数要求写一个函数,返回该数组中,除本身数字之外其他元素的成积.即返回如下:// 过程[4*3*4*5, 1*3*4*5, 1*4*4*5, 1*4*3*5, 1*4*3*4]// 结果[240, 60, 80, 60, 48]题目要求不使用除法,且时间复杂度为o(N)思路如下...原创 2020-03-16 20:17:08 · 218 阅读 · 0 评论 -
算法 --- > 回溯法
回溯法参考 - 剑指Offer回溯法可以看成蛮力法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案.回溯法解决的问题的特性:可以形象地用树状结构表示:节点: 算法中的每一个步骤节点之间的连接线: 每个步骤中的选项,通过每一天连接线,可以到达下一个子步骤叶子节点: 代表一个步骤的最终状态如果在叶节点的状态满足需求,那么我们找到了一个可行的解决方案...原创 2020-03-08 21:42:15 · 249 阅读 · 2 评论 -
算法 --- > 递归实现多级树展开结构
在项目中,经常会给出一个深度不确定的数组,数字结构如下:data = [ {name: 'a', child:[{name: 'a1'},{name: 'a2', child: [{name:'a21'}]}]}, {name: 'b'}]要求将数组渲染成对应的目录结构, 结构如下:<ul> <li> a ...原创 2020-02-08 18:21:08 · 1157 阅读 · 2 评论 -
算法 --- > [队列结构]二叉树的层次遍历
思路使用队列:初始化的时候,将root, push进队列q中循环队列q,当其中不为空时,取出第一个元素(q.shift),记为r若r.left不为空,将r.left推进q,若r.right不为空,将r.right推进q记录层次:4. 初始化设置i =0;5. 在入队的时候,入队一个对象{r: root, i}6. 出队时,使用es6的解构赋值取出 {r , i}实现如下:...原创 2019-12-21 14:55:39 · 118 阅读 · 0 评论 -
算法 --- > [map的使用]求最大和谐子序列
说明和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。输入: [1,3,2,2,5,2,3,7]输出: 5原因: 最长的和谐数组是:[3,2,2,2,3].思路创建一个map用于统计数组中的值,及值出现的次数创建一个max,用来保存出现的最大次数遍历map,在map中寻找...原创 2019-12-16 10:15:17 · 195 阅读 · 0 评论 -
算法 --- > 求两个集合的并集
const unionL = (l1, l2)=>{ for(let i=0; i <l1.length; i++){ if(l2.indexOf(l1[i]) === -1){ l2.push(l1[i]) } } return l2}let l1 = [1,2,3,4];let l2 = [1,2,5];console.log(unionL(l1,l2...原创 2019-10-20 08:48:34 · 2632 阅读 · 0 评论 -
算法 --- > 递归生成括号
问题描述思路:1.首先生成n个括号2.左括号数量(记为l)不超过n3.右括号数量(记为r)不超过n,且优先生成左括号(即 l < r)4.需要设计一个递归式h(str,l,r)// 一开始,str = '', l = 0, r= 0// 第一步进去,添加左括号, str='(', l = 1, r =0// 然后因为 l < n . r < l 所以会有2个h...原创 2019-09-11 11:11:00 · 240 阅读 · 0 评论 -
算法 --- > reduce的使用.
描述:难点:将[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]输出为[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].关键代码描述:1.假设我们已经根据输入的数字得到了 rawArr = [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]2. 下一步将rawArr[0]中的每一个元素与 rawArr[1]中的...原创 2019-09-11 09:59:35 · 255 阅读 · 0 评论 -
es6 --- > map的使用
思路:1.使用一个map数组来保存nums1中出现的元素及其次数.2.遍历nums2.使用map的has方法来检测nums2中的元素是否出现在map中,若出现则加入返回数组(retArr),且map数组中的次数减1/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */var i...原创 2019-09-04 09:56:51 · 134 阅读 · 0 评论 -
算法 --- > 翻转二叉树
解(C++):1.二叉树判空 if(root == 0) 或 if(root == nullptr);2.二叉树的左子树: root->left .3.使用递归,将当前根节点的左右指针指向互换左向右子树(此时右子树也进行了翻转)// C++/** * Definition for a binary tree node. * struct TreeNode { * i...原创 2019-08-02 10:17:49 · 273 阅读 · 1 评论 -
算法 --- > 快慢指针判断链表是否有环
解题思路:分别设置2个指针(s,q)指向链表的头部,s每次指向下面一个(s = s.next),q每次指向下面2个(q = q.next.next).如果存在环,q总会在某一时刻追上s/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this...转载 2019-07-23 10:48:49 · 110 阅读 · 0 评论 -
算法 --- > 归并排序的js实现
let mergeSort = (A, p, q, r) => { console.log("原数组>>>", A); let n1 = q - p + 1; let n2 = r - q; let L = new Array(); let R= new Array(); for (let i = 1; i < n1 +...原创 2019-04-03 10:35:47 · 111 阅读 · 0 评论 -
算法 --- > 顺序查找、二分查找的js实现
顺序查找:function seqSearch(arr, data) { for(let i = 0; i< arr.length;i++) { if(data == arr[i]) { return i; } } return -1}var arr=[3,44,38,5,47,15,36,26,27,2,...转载 2019-06-12 19:51:22 · 138 阅读 · 0 评论 -
算法 --- > 冒泡排序、选择排序、插入排序的js实现
冒泡排序:function bubbleSort(arr){ let i = arr.length; while(i >0){ for(let j = 0; j< i; j++) { let pos = 0; if(arr[j] > arr[j+1]) { pos =...转载 2019-06-10 19:43:21 · 111 阅读 · 0 评论 -
算法 --- > 希尔排序、归并排序、快速排序的js实现
希尔排序:function shellSort(arr) { let len = arr.length; let temp, gap = 1; while(gap < len/3) { gap = gap*3 +1 } while(gap >=1) { for(let i = gap;i< len; i++...转载 2019-06-11 21:15:25 · 148 阅读 · 0 评论 -
算法 --- > 有效的括号
解题思路:1.对括号分别赋值(左括号大于0,右括号小于0),方便后期比较2.使用栈,对于大于0的字符串入栈,对于小于0的字符串,检查栈中是否有元素,若没有返回false,否则拿出栈顶的一个元素,和现在的元素进行比较/*** @param {string} s* @return {boolean}*/var isValid = function(s) { let tr ={ ...原创 2019-07-12 18:02:38 · 180 阅读 · 0 评论 -
算法 --- > 删除数组中重复项
解题思路:如果输入的数组长度为1,则返回该数组否则(len>2),使用i记录当前待插入的位置,j记录下一个与nums[i]不相等的位置,leng为待返回数组的长度当nums[i] !== nums[j]时,把j位置的值nums[j]放在i+1位置.同时i++,j++/** * @param {number[]} nums * @return {number} */var...原创 2019-07-12 19:49:46 · 212 阅读 · 0 评论 -
算法 --- > 判断某个值是否在二叉搜索树中
首先看一下map的使用:let list = [1, 2, 3];console.log(list.map(a => a*a));可以看出map的作用是遍历整个数组并,对数组中的每个元素执行指定的操作.并返回一个新数组下面就尝试写一个map:function map(arr, fn) { let len = arr.length, idx = 0, ...原创 2019-07-11 11:05:01 · 394 阅读 · 0 评论 -
算法 --- > 二叉树的最大深度
思路:1.二叉树的深度,等于Max(左子树最大深度,右子树最大深度) + 12.节点不存在时,此时的深度为03.当节点存在,左右子树不存在时(此时为叶子节点) 返回1/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = ...原创 2019-07-16 13:54:18 · 90 阅读 · 0 评论 -
算法 --- > 反转数组
几个注意点:1.输出的时候,也要做数字超出处理2.js中可以使用 0 +str 将字符串类型转换成数字类型3.可以使用 num + ‘’ 将数字类型转换成字符串类型4.使用str.split(’’) 可以将字符串转换成数组5.使用arr.join(’’) 可以将数组转换成字符串/** * @param {number} x * @return {number} */var r...原创 2019-07-12 10:33:08 · 279 阅读 · 0 评论 -
算法 --- > 罗马数字转整数
解体思路:1.写一个对象trans用于保存罗马和数字之间的映射关系2.重点在于当数值小的出现在数值大的左边时,会减去该数,出现在右边时会加上该数,因此需要与后面的进行比较3.在得到s时,首先给它转换成字符串,并在末位加一个0/** * @param {string} s * @return {number} */var romanToInt = function(s) { ...原创 2019-07-12 11:29:53 · 87 阅读 · 0 评论 -
算法 --- > 平衡二叉树
解题思路:1.首先写一个返回深度的函数d2.写一个遍历函数t3.在t中首先判断,r是否为空(为空则此时就是平衡二叉树,返回true),然后判断是否为叶子节点(r.left ===null && r.right === null)若是则返回true,最后判断,其左子树的深度与右子树的深度之差是否大于1.若是则返回false4.到了这里,则对r的左右子树分别调用t,返回其左右...原创 2019-07-17 08:45:02 · 74 阅读 · 0 评论 -
算法 --- > 二叉树查找树的先序(中序、后序)遍历的js实现
结点:function Node(data, left, right) { this.data = data; this.left = left; this.show = show;}显示树的数据:function show(){ return this.data;}二叉查找树:// Binary Search Treefunction BST(...转载 2019-06-11 22:26:25 · 536 阅读 · 0 评论 -
算法 --- > 插入排序的JS实现
let A = [5, 2, 4, 6, 1 ,3];// 插入排序insertionSort = (A) => { console.log("原数组>>>", A); for (let j=1; j<A.length; j++) { let key = A[j]; i = j -1; while ...原创 2019-04-03 09:40:54 · 88 阅读 · 0 评论