算法
云云的云
码无止境
展开
-
什么是前缀和?leetcode例题解答
前缀和假设给定数组[1,1,1,1]以及两个下标j k j<k,现在要你求j到k的所有数字的和,怎么做呢?我们当然可以根据这两个下标把对应的数字依次累加从而得到结果,这没问题,但如果我们要求很多个范围的和,这个数组也很大,每次都得从头开始累加就特别耗时了,有没有什么办法能从O(1)的时间复杂度直接得到结果,这就需要利用到前缀和。假设我们有一个前缀和数组preSum,它和原数组的对应关系如下,也就是说我们通过一次遍历,已经知道了从下标0到每个下标 i 的元素和那么现在,我们要知道下标1到下标3的原创 2021-09-14 16:13:14 · 276 阅读 · 0 评论 -
JS二叉树的三种遍历【递归】
前序遍历:var preorderTraversal = function(root, res = []) { if (!root) return res; res.push(root.val); preorderTraversal(root.left, res) preorderTraversal(root.right, res) return res;};中序遍历var inorderTraversal = function(root, res =原创 2021-08-11 10:41:38 · 203 阅读 · 0 评论 -
JS二叉树的三种遍历【迭代】
前序遍历lc.144迭代法var preorderTraversal = function(root) { // 初始化数据 const res =[]; const stack = []; while (root || stack.length){ while(root){ res.push(root.val); stack.push(root); root = root.left; }原创 2021-08-10 10:58:00 · 321 阅读 · 0 评论 -
leetcode322.找零钱
经典动态规划,迭代法会超时,直接分析动态规划的几个重点1、状态:dp数组要存什么对于本题,每个问题可以分解成相同的子问题,具体一点举例,求amout的最小硬币数,转化为求amount-1的最小硬币数等等。。dp数组存的就是amount2、状态转移方程具体来看,假设我们有【1,2,5】三种硬币,需要求amount=100的最小硬币数,按照分解的思路,我们要求 max(amount-1最小硬币数+1,amount-2最小硬币数+1,amount-5最小硬币数+1)所以状态转化方程便是dp[i].原创 2021-08-06 10:58:19 · 407 阅读 · 0 评论 -
Leetcode283【Js】
1、使用mapvar moveZeroes = function(nums) { let index = 0 nums.map(i=>{ if(i!=0){ nums[index] = i index++ } }) nums.fill(0,index)};2、双指针右指针遇到0则右移,非0则与左指针交换。思路:把非0数前移,最后补0var moveZeroes = fun.原创 2021-07-27 10:55:00 · 99 阅读 · 0 评论 -
剑指Offer 43 / leetcode.23【Js】
1、暴力法直接一个for循环,再用正则匹配得到每一项中1的个数,最后相加。简单粗暴,可是很遗憾,超时了。。。/** * @param {number} n * @return {number} */var countDigitOne = function(n) { let res = 0; for(let i=0;i<=n;i++){ if(i.toString().indexOf('1')!==-1){ let temp = .原创 2021-07-26 10:42:51 · 164 阅读 · 0 评论 -
leetcode.204 计数质数【Js】
1、(傻瓜向)遍历判断质数从0到根号n,先来判断n是否是质数,再计数。/** * @param {number} n * @return {number} */var countPrimes = function(n) { let isPrime = (n)=>{ for(let i=2;i<=Math.sqrt(n);i++){ if(n%i===0) return false; } return .原创 2021-07-23 11:12:05 · 134 阅读 · 0 评论 -
leetcode.300【Js】
dp[i]的定义:dp[i]表示i之前包括i的最长上升子序列。状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。if (nums[i] > nums[j]){dp[i] = max(dp[i], dp[j] + 1);}注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。dp[i]的初始化每一个i,对应的dp[i](即最长上升子序列)起始大小至少都是是1.确定遍历顺序dp[i] 是有0到.原创 2021-07-20 10:50:57 · 170 阅读 · 0 评论 -
LeetCode.125验证回文串【Js】
大体思路是先拿到纯净数据(只考虑字母数字),然后再判断是否是回文串,注意要统一大小写。想到两种方式拿到纯净的数据第一种是用asc码+arr.filter()进行筛选第二种考虑用正则拿到数据之后使用数组api:reverse()和join()直接对比字符串返回结果。代码如下var isPalindrome = function(s) { if(!s) return true; let arr = []; for(let i=0;i<s.length;i++){.原创 2021-07-16 10:50:42 · 135 阅读 · 0 评论 -
leetcode55、45.跳跃游戏 I&II
如果某一个作为起跳点的格子可以跳跃的距离是3,那么表示后面的3个格子都可以作为。 可以对每一个能作为起跳点的格子都尝试跳一次,把能跳到最远的距离不断更新。 如果可以一直跳到最后,就成功了。否则在过程中返回false退出/** * @param {number[]} nums * @return {boolean} */var canJump = function(nums) { let range = 0; for(let i=0;i<nums.length;i+...原创 2021-07-15 11:08:46 · 195 阅读 · 0 评论 -
剑指offer 62【Js】
很有意思的一道题,暴力超时之后看到了一种巧妙地数学解法。约瑟夫环【逆推迭代】逆推公式:当前index = 上轮(index+m)% 剩余个数i/** * @param {number} n * @param {number} m * @return {number} */var lastRemaining = function(n, m) { let index = 0; for(let i=2;i<=n;i++){ index = (index+m.原创 2021-07-13 10:47:51 · 81 阅读 · 0 评论 -
剑指offer 50【Js】
方法一:使用indexOf Api,判断最初出现和最后出现位置是否一致,一致则直接输出。否则输出空。var firstUniqChar = function(s) { for(let x of s){ if(s.indexOf(x) === s.lastIndexOf(x)) return x } return ' '};方法二:使用map把值和出现次数映射,然后再找出第一个出现次数为1的值/** * @param {string} s * @r.原创 2021-07-12 11:10:14 · 101 阅读 · 0 评论 -
剑指Offer 39
原地数组时间复杂度空间复杂度较高/** * @param {number[]} nums * @return {number} */var majorityElement = function(nums) { let len = nums.length; let arr = Array(50000).fill(0); for(let i=0;i<len;i++){ if(!arr[nums[i]]){ arr[nums[i].原创 2021-07-06 10:40:07 · 113 阅读 · 0 评论 -
剑指offer 29/leetcode 54 螺旋矩阵【js】
按照→↓←↑ 的顺序进行遍历,每次走完一边都要判断是否已经符合要求即res数组长度等于row*colomn代码如下:/** * @param {number[][]} matrix * @return {number[]} */var spiralOrder = function(matrix) { if(!matrix.length) return []; let row = matrix.length; let comlumn = matrix[0].length.原创 2021-07-01 10:27:12 · 90 阅读 · 0 评论 -
剑指offer 33 二叉搜索树后序 js
后序遍历:前 后 根二叉搜索树 :左 < 根 < 右思路:找到根节点之后判断左右子树是否满足二叉搜索树再递归判断左右子树。Js代码如下:/** * @param {number[]} postorder * @return {boolean} */var verifyPostorder = function (postorder) { let len = postorder.length; // 若为叶子节点,则返回 true if (len <..原创 2021-06-30 11:41:22 · 85 阅读 · 0 评论 -
leetcode 39.组合总和 Js
第一想法暴力,然后简单画了两笔发现应该是dfs回溯。然后按“公式”先找dfs结束条件:1、当前总和等于目标 将结果压入结果集 返回2、当前总和大于目标 直接返回注:加入结果集时要复制数组。可以使用 res.push(...[temp])dfs时注意:三个参数(index 开始时的序列,当前数组,当前数组总和)1、第二次dfs传入index为i :保证每次都从当前index向右找(避免了重复情况)2、数组回溯要push&pop代码:/** * @param {number..原创 2021-06-29 10:35:02 · 189 阅读 · 0 评论 -
leetcode11盛水最多的容器 JS
看到题目的第一感觉是动态规划,于是乎开始苦思冥想了一波。无果然后尝试用笨法做(升级版暴力)从两侧向内包围。每次选择较小的一边向内收紧。保留一个最大的面积res,最终通过。代码如下/** * @param {number[]} height * @return {number} */ //动态规划||双指针 ✅var maxArea = function(height) { let cur1 = 0; let cur2 = height.length-1; let.原创 2021-06-28 10:50:47 · 209 阅读 · 0 评论 -
leetcode 34&35
1、快速解法:使用数组AP,思路清晰,核心是倒置数组来寻找结束的位置。、时间复杂度不好说(API)空间复杂度O1/** * @param {number[]} nums * @param {number} target * @return {number[]} */var searchRange = function(nums, target) { if(!nums.includes(target)) return [-1,-1]; let first = nums.ind.原创 2021-06-25 10:44:01 · 87 阅读 · 0 评论 -
leetcode 22:括号生成
暴力法:先将n个( 和n个)全排列,生成a 2n个不同组合,再进行判断是否构成有效括号。lc有类似的判断括号是否有效的题。(lc 20)时间复杂度On空间复杂度On回溯法:dfs函数携带三个参数(左括号剩余,右括号剩余,和当前字符串)当字符串长度满足需求时压入结果数组为了让括号生成出来即有效(不必再次判断结果字符串是否有效)则需要满足两个条件1、有左括号剩余优先左括号。2、右括号只有在数量大于左括号时才使用右括号。tip:字符串回溯,不需要像数组一样复制和增删操作。时间复杂度On.原创 2021-06-24 10:24:56 · 205 阅读 · 0 评论 -
leetcode12 整数转罗马数字
由于存在放在左边的情况,排列方式并非一种,所以方便起见,可以把特殊情况的组合单独拎出来,打表(字典法)来做。1、首先尝试了对象字典var intToRoman = function (num) { let res = ""; let table = { 1000: "M", 900: "CM", 500: "D", 400: "CD", 100: "C", 90: "XC", 50: "L", 40: "XL", 10: "X", 9: "IX", 5:.原创 2021-06-23 10:45:53 · 96 阅读 · 0 评论 -
Js双指针解决有序数组、链表合并
双指针在很多题型中都有应用,快慢指针,左右指针。简单的双指针可以用来解决有序数组链表的排序问题。常见题一:Leetcode21 合并两有序链表思路:两个链表分别放置一个指针,新建一个含有哑节点的链表,while遍历两条链表,链表A到头了 :新链表下一位连到B的当前位置,B指针向后走一位链表B到头了 :新链表下一位连到A的当前位置,A指针向后走一位都没到头就作比较:新链表下一位指向较小的(题目要求升序),并且向后走一位且每轮遍历新链表指针向后走一位。/** * Definitio.原创 2021-05-11 17:58:37 · 230 阅读 · 0 评论 -
leetcode.200 岛屿数量(DFS)
我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的,而岛屿问题是在一种「网格」结构中进行的。有所不同但也可以类比进行分析。以lc200为例,写一下分析过程。常见的DFS应用二叉树结构,有两个重点边界条件(退出条件)经常用if(!root)扩散方式一般是 dfs(root.left) dfs(root.right)如果是grid网格结构,则边界条件四个边不出界扩散方式每次向四个方向上扩散以lc200为例边界条件: if(i<0||.原创 2021-05-05 12:51:41 · 171 阅读 · 0 评论 -
赛码—动脑子认老乡 JS实现
笔试要用这个平台,所以提前来熟悉一下,刷惯了LeetCode的贴心服务,这个平台手动处理输入确实很烦,而且没有代码补全。。。首先是处理输入,思路是把NM和后面的数据都存到数组里,然后后面利用数组操作解题。根据题意,我们应该找到和1相同的所有人,求出数量很显然第三位为0的数据对我们毫无用处,只需要找第三位为1的数据即可我的思路是,选择第三位为1的数据,然后判断是否含1,然后利用set将与1有关的所有数add进set中。最后求set.size,若数据中无1,则输出0。最后避免因顺序漏掉的数,加一..原创 2021-04-08 10:44:01 · 284 阅读 · 0 评论 -
链表两数相加\字符串相加问题
这两天刷面经上的算法题,有两道类似的题,都是关于手动实现加法,总结了一下做法和技巧。leetcode415:字符串相加两个字符串,逢10进1,相加求结果不能直接使用类型转换,题意就是要手动实现一下加法由于js的字符串的内部装箱操作,字符串可以进行遍历查询长度等操作,首先把两个字符串对齐,缺位补0即可接下来就是计算部分,设置个进位数,逢10进1/** * @param {string} num1 * @param {string} num2 * @return {string} *.原创 2021-03-22 11:06:02 · 200 阅读 · 1 评论 -
剑指offer 21.22
JS一发过/** * @param {number[]} nums * @return {number[]} */var exchange = function(nums) {let arr = [];for(let i =0;i<nums.length;i++){ if((nums[i]&1)==0){ arr.push(nums[i]); }else{ arr.unshift(nums[i]); }}retur.原创 2021-03-17 21:06:01 · 107 阅读 · 0 评论 -
剑指offer 14
JS ——贪心var cuttingRope = function(n){ if(n%3==1){ if((n-4)/3>0){ let i = (n-4)/3; return Math.pow(3,i)*4; }else return 4; }else if(n%3==2){ if((n-2)/3>0){ let i = (n-2)/3; .原创 2021-03-15 15:49:54 · 101 阅读 · 0 评论 -
剑指offer 12
js/** * @param {character[][]} board * @param {string} word * @return {boolean} */var exist = function(board, word) { const row = board.length; const column = board[0].length; function dfs(arr,r,c,word,index){ if(r<0||r>=ro.原创 2021-03-01 13:53:50 · 100 阅读 · 0 评论 -
剑指offer 11 && JS快速排序
JS/** * @param {number[]} numbers * @return {number} */var minArray = function(numbers) { if(!numbers){ return [] } for(let i = 0; i < numbersLength; i++){ if(numbers[i] > numbers[i + 1]){ return numbers[.原创 2021-02-28 12:29:30 · 100 阅读 · 0 评论 -
剑指offer 9、10
乍一看,一道简单题为什么如此复杂,主要是函数体有点复杂,理解题意但想了半天不会写,后来看了下题解恍然大悟,原来是这个意思,确实是一道简单题= =、var CQueue = function() { this.stack1 = []; this.stack2 = [];};/** * @param {number} value * @return {void} */CQueue.prototype.appendTail = function(value) {this..原创 2021-02-26 20:59:17 · 120 阅读 · 0 评论 -
剑指Offer 05 、06
前两天刚做了个URL的题 和这个很像JS var replaceSpace = function(s) { return s.replace(/\s/g,'%20'); };利用正则和replaceJSvar replaceSpace = function(s) {const len = s.length;let arr = s.split('');for(let i =0;i<len;i++){ if(arr[i]==" "){ arr[i]='%20'.原创 2021-02-23 23:15:04 · 86 阅读 · 0 评论 -
剑指Offer 04 二维数组中的查找
JS 1非预期解法/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */var findNumberIn2DArray = function(matrix, target) { let arr = matrix.flat(Infinity); for(let i of arr){ console.log(i) if(i == target).原创 2021-02-22 14:50:14 · 108 阅读 · 0 评论 -
Leetcode 面试题URL化
JSvar replaceSpaces = function(S, length) { let strArr = S.split(" "); let len = strArr.length; const space = "%20"; let res = ""; let truestr="" let elenum=0; for(let i =0;i<len;i++){ truestr+=strArr[i]; } .原创 2021-02-22 00:00:32 · 100 阅读 · 0 评论 -
Leetcode No.111
JS 自顶向下的判断/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */.原创 2021-02-20 20:19:45 · 91 阅读 · 0 评论 -
LeetcodeNo.566
JS/** * @param {number[][]} nums * @param {number} r * @param {number} c * @return {number[][]} */var matrixReshape = function(nums, r, c) {let flatres = nums.flat(Infinity);let cache =[];let res = [];if(r*c!=flatres.length){ return nums;}.原创 2021-02-17 16:11:58 · 115 阅读 · 0 评论 -
Leetcode No.561
JS/** * @param {number[]} nums * @return {number} */var arrayPairSum = function(nums) { let arr = []; let res = 0; let mysort = (x,y)=>x-y; arr = nums.sort(mysort); for(let i =0;i<nums.length/2;i++){ res = res+arr[2*.原创 2021-02-16 14:38:57 · 95 阅读 · 0 评论 -
Leetcode No.94
趁昨天的二叉树继续写一道JS/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * .原创 2021-02-14 10:28:40 · 82 阅读 · 0 评论 -
Leetcode No.104
JS ——DFS/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } *//.原创 2021-02-13 14:46:33 · 130 阅读 · 2 评论 -
JS随机字符串生成
题目要求:实现一个随机符串生成函数 randomStr(),要求如下:生成的随机的字符串应该以字母开头,并包含 [a-z][0-9] 这些字符。生成的字符串长度为 8。生成的字符串不能够在程序运行的生命周期中存在重复的情形。const randomStr = () => { let map = { 1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: '原创 2021-02-12 12:22:14 · 1088 阅读 · 0 评论 -
Leetcode No.69
JS/** * @param {number} x * @return {number} */var mySqrt = function(x) { if(x<=1){ return x; }for(let i =0;i<x;i++){ if(i*i<=x&&(i+1)*(i+1)>x){ return i; }}};手写一个sqrt可显然我写这个效率实在太慢了。Pythoncl.原创 2021-02-03 23:15:16 · 89 阅读 · 0 评论 -
Leetcode No.70
祖传爬楼梯JS 1笨比递归:超时!!超时!!/** * @param {number} n * @return {number} */var climbStairs = function(n) { if(n===1){ return 1; }else if(n==2){ return 2; }else { return climbStairs(n-1)+climbStairs(n-2); }}; JS 2原创 2021-02-02 13:31:09 · 109 阅读 · 0 评论