
日拱一算法
尹宇星 Kim
这个作者很懒,什么都没留下…
展开
-
力扣 0055 - 跳跃游戏Ⅰ
题目详情:跳跃游戏Ⅰ说好每日一拱的算法练习,因为某些原因断了好多天。1. 思路利用动态规划的思想,要到达目的地 i,只要前一个格子 i-1 的步数大于 0,如果不巧 i-1 的格子正好是 0, 那就要看 i-2 能不能达到 i,以此类推。然后每当一个格子 x 可以被前面某个格子 y 到达,则目的地格子就变成了 y。2. 代码JavaScriptvar canJump = functi...原创 2020-04-17 10:07:26 · 250 阅读 · 0 评论 -
力扣 0365 -水壶问题
题目详情:水壶问题1. 思路这道题有两种解题思路。第一种是利用深度搜索(递归),每次遍历所有可能的操作(6种):把 X 壶的水灌进 Y 壶,直至灌满或倒空;把 Y 壶的水灌进 X 壶,直至灌满或倒空;把 X 壶灌满;把 Y 壶灌满;把 X 壶倒空;把 Y 壶倒空。这种解法算是能想到的标准解法,不过时间和空间都不好。第二种是利用数学思维,求出 X 壶和 Y 壶的最大公约数 ...原创 2020-03-22 08:13:19 · 162 阅读 · 0 评论 -
力扣 0040 - 最小的 k 个数
题目详情:最小的 k 个数1. 思路一种思路是利用快速排序,然后取前 k 个数。另一种思路是构建一个大顶堆。数组中的数字依次进入大顶堆,当堆的长度小于 kkk 的时候,则加入堆尾,然后自底向上进行堆调整;当堆的长度大于等于 kkk 的时候,就比较堆顶元素和进入的数字,如果进入的数字大,则直接丢弃;反之,则将堆定元素替换成进入的数字,然后自顶向下进行堆调整。2. 代码(JavaScript ...原创 2020-03-21 07:35:57 · 221 阅读 · 0 评论 -
力扣 0409 - 最长回文串
题目详情:最长回文串1. 思路这个题目难点在于找到“最长回文串”的规律。自己可以手写几个回文串,然后统计下每个字母的数量。“最长回文串”的规律就是:取每个字母的数量的最大偶数(比如,3就取2,7就取6)相加,如果字母中的数量有奇数,则在结果最后再加 1。2. 代码(JavaScript 版)/** * @param {string} s * @return {number} */...原创 2020-03-19 13:13:24 · 103 阅读 · 0 评论 -
力扣 0836 - 矩形重叠
题目详情:矩形重叠1. 思路将 xxx 轴方向设为长,将 yyy 方向设为高。矩阵1的长 width1 = rect1[1] - rect1[0],高 height1 = rect1[3] - rect1[1]同理求出矩阵2的长 width2 和高 height2。继续求出两个矩形的中心点 (x1,y1)(x_1, y_1)(x1,y1) 和 (x2,y2)(x_2, y_2)(x2...原创 2020-03-19 08:51:45 · 149 阅读 · 0 评论 -
算法题:2 的幂
leetcode 地址:2 的幂1. 思路首先我们要找到 2 的不同幂次的数的特征,比如:2 是 104 是 1008 是 1000找到规律后,参考 算法题:位 1 的个数 里面用到的那个去除低位 0 的方法。2. 代码➥ JavaScript/** * @param {number} n * @return {boolean} */var isPowerOfTwo...原创 2020-03-08 15:58:25 · 226 阅读 · 0 评论 -
算法题:位 1 的个数
leetcode 地址:位 1 的个数1. 思路1.1 方法一对 n 每次执行 n % 2 的操作1.2 方法二使用位运算,老实说这个方法不知道的估计也想不出,知道也就知道了 ????2. 代码(方法二)➥ JavaScript/** * @param {number} n - a positive integer * @return {number} */var hammin...原创 2020-03-08 15:40:58 · 173 阅读 · 0 评论 -
算法题:单词搜索Ⅱ
leetcode 地址:单词搜索Ⅱ1. 思路先将单词构造成 Trie(前缀树)然后两层循环遍历格子里的所有字母每个被遍历到的字母作为单词的开头,去 Trie 匹配3.1 如果不匹配,则直接下个格子开始3.2 如果 search 匹配到,则放入 result 中3.3 如果 startWith 匹配到,则开始爬(move 方法)格子,有四个方向3.4 search 匹配成功必然 ...原创 2020-03-06 14:50:06 · 405 阅读 · 0 评论 -
算法题:实现 Trie(前缀树)
leetcode 地址:实现 Trie(前缀树)1. 什么是前缀树Trie 也叫前缀树,核心的思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销,以达到提高效率的目的。2. 思路如何判断结尾的地方是曾经被 insert 过的“单词”,我觉得是这题的重点。从题目示例可以看到trie.insert('apple')trie.search('app') // falsetrie....原创 2020-03-06 11:29:50 · 264 阅读 · 0 评论 -
算法题:有效的数独
leetcode 地址:有效的数独思路就按照数独的规则来判断,有三条:横向数字不重复纵向数字不重复3x3 的范围内不重复循环依然利用深度优先的思路。代码➥ JavaScript/** * @param {character[][]} board * @return {boolean} */var isValidSudoku = function(board) { ...原创 2020-03-05 15:32:37 · 195 阅读 · 0 评论 -
算法题:N 皇后
leetcode 地址:N 皇后好几天没更新了,一是确实被这题卡住了,二是最近上线的东西有点多。思路采用 DFS 遍历的方式,先按行一路往下冲,当某行没有位置可放的时候,再调整下上一行的皇后位置,继续往下冲。这道题我觉得有 3 个关键点:找出限制条件,也就是每放一个皇后,哪些地方是不能再放了。经过分析可以看到,一个皇后会控制三个方向,我们称之为列、撇、捺。限制条件的传递,每一行得记...原创 2020-03-04 10:46:32 · 167 阅读 · 0 评论 -
算法题:二叉树的层次遍历
leetcode 地址:二叉树的层次遍历思路方法一:广度优先方法二:深度优先代码➥ JavaScript(方法一)/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * ...原创 2020-02-28 10:02:35 · 344 阅读 · 1 评论 -
算法题:Pow(x, n)
leetcode 地址:Pow(x, n)思路方法一:暴力破解,时间复杂度 O(n)O(n)O(n)方法二:分治思想,也叫快速幂,时间复杂度 O(log2n)O(\log_2n)O(log2n)方法三:利用位运算右移一位代表除以 2 的特性进行计算,时间复杂度也是 O(log2n)O(\log_2n)O(log2n)代码➥ JavaScript(方法二)var myPo...原创 2020-02-27 14:00:24 · 274 阅读 · 0 评论 -
算法题:二叉(搜索树)的最近公共祖先
leetcode 地址:二叉搜索树的最近公共祖先思路有两种情况会成为公共祖先:第一个分叉点当前节点等于两个节点中的一个代码➥ JavaScript/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this....原创 2020-02-26 16:43:43 · 196 阅读 · 0 评论 -
算法题:验证二叉搜索树
leetcode 地址:验证二叉搜索树对于二叉搜索树中的某个节点,这个节点的左子树的值都小于该节点,右子树的值都大于该节点。思路方法一对树进行中序遍历,看是否得到一个有序的数组方法二递归每个节点,看是否满足二叉搜索树的要求。这个方法的关键是要理解节点分成四种类型:自身是左节点,父节点是左节点,则取值范围是 [−∞,val)[-∞, val)[−∞,val)自身是右节点,父节...原创 2020-02-25 14:38:59 · 90 阅读 · 0 评论 -
算法题:有效的字母异位词
leetcode 地址:有效的字母异位词思路假设有字符串 s 和 t:将两个字符串里的字母排序,排完之后看看两个字符串是否完全相等,时间复杂度 O(nlog2n)O(n\log_2n)O(nlog2n)(快快速排序)。利用一个 Map 结构,key 是字符串中出现的字母,value 是字母出现的次数。其中 s 中出现的字母对于 value 是 +1,t 中出现的字母对 value ...原创 2020-02-21 15:45:56 · 138 阅读 · 0 评论 -
算法题:滑动窗口最大值
leetcode 地址:滑动窗口最大值思路维护一个长度最大为 k 的数组 queen(里面存 index),让输入数组 nums 中的元素依次进入该数组。每有新元素进入的时候,对数组进行维护:删除比该元素小的数值的索引,将当前元素的索引存入数组末尾。这样可以做到数组第一个元素永远是最大的。例如:nums = [1,5,4,9,7,8,6],k=3,数值进出 queen 的过程如下:i =...原创 2020-02-20 14:32:49 · 267 阅读 · 0 评论 -
函数:通过数组构建小顶堆
二叉堆本质上是一种完全二叉树,它分为两个类型:最大堆 / 大顶堆最小堆 / 小顶堆本文以实现最小堆为例,代码如下➥ JavaScriptfunction createMiniHeapFromArray(array, len = array.length) { for (let i = Math.floor((len - 2) / 2); i >= 0; i--) { // ...原创 2020-02-17 16:52:04 · 495 阅读 · 0 评论 -
算法题:用栈实现队列
leetcode 地址:用栈实现队列解题思路栈是先进后出 FILO,队列是先进先出 FIFO。利用两个栈,一个叫做“输入栈”,另一个叫做“输出栈”。当执行 push 操作当时候,往输入栈里添加元素;当执行 pop 和 peek 操作当时候,先检查“输出栈”里有没有元素,如果有则直接出,如果没有,就将输入栈里当元素依次放入输出栈里。代码➥ JavaScript/** * Initia...原创 2020-02-14 14:52:43 · 161 阅读 · 0 评论 -
算法题:环形链表
leetcode 地址:环形链表解题思路思路一暴力破解 - 设置一个时间(0.5s ~ 1s),如果在这个时间内没有走到尾节点,则认为是环形链表。思路二将当前节点存入一个 Set 中,同时判断该节点的下个节点是否在 Set 中,如果存在,则是环形链表。该解题方法唯一的不足,是需要额外的空间存放已经走过的节点。思路三快/慢指针,经典的解题方法。缺点是大部分的开发第一次接触到该题是...原创 2020-02-14 09:08:51 · 158 阅读 · 0 评论 -
算法题:反转链表
leetcode 地址:反转链表解题思路假设 node 为当前节点,prevNode 为前驱节点,nextNode 为后继节点。反转一个节点的步骤大致如下:nextNode = node.nextnode.next = prevNodeprevNode = node依次反转每个节点。代码➥ JavaScriptfunction reverseList(head) { le...原创 2020-02-12 15:37:32 · 159 阅读 · 0 评论