
基础算法
文章平均质量分 69
起晚的蜗牛
Though getting up late, I will keep going and never give up.
展开
-
矩阵中的路径 深度优先
剑指 Offer 12. 矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],["s","f","c","s"],["a","d","e","e"]]但矩阵中不包含字符串“abfb”的路径,因为字原创 2020-08-26 11:41:01 · 276 阅读 · 0 评论 -
零钱兑换 动态规划
零钱兑换给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。解题思路,其实这一个一维的动态规划, 总结金额 从0 增加到amout;1. 对总金额 i,兑换方式可以是:从中任意取出一个硬币后,剩下金额的对方方式+1; 因为是任意的,取出的币值就是coins中的元素。 因此计算最少方式,就是取各种币值后,计算各种情况下(剩下金额的对方方式+1) 的最小值;dp[i] = Mi...原创 2020-08-19 01:02:45 · 442 阅读 · 0 评论 -
二维动态规划,硬币
面试题 08.11. 硬币硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007);解题思路:二维动态规划,画矩阵。1. 行维:币种从1到4(按币值排序后逐渐增加), 列维:面值逐渐增加从0到n; 0 1 2 3 4 5 ... i-1 i n 1 (+1分) 1 1 1 1 1...原创 2020-08-18 23:07:20 · 213 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。解题思路:1. 特殊的排序算法,x + “” +y < y+ "" +x时, x < y;2. 排序算法有很多种,挑一种使用;1. 选择排序:/** * @param {number[]} nums * @return {string} */var minNumber = function(nums) { const searchMinIn...原创 2020-08-09 18:22:39 · 198 阅读 · 0 评论 -
矩阵螺旋输出
剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。1. 用行增量和列增量决定下一步方向2. 到达边界时,换方向;同时缩小边界条件;3. 当左右边界,上下边界重合时了,完成全部遍历;/** * @param {number[][]} matrix * @return {number[]} */var spiralOrder = function(matrix) { if(matrix.length ===0) re.原创 2020-08-09 16:52:13 · 286 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?解题思路:1. 从第一个点到最后一个点依次计算每个格子 的最大值;2. 每个格子的最大值 为 上面一个点或者下面一个点的最大值与当前点的和;3. 注意边界条件: 第一行和第一列;/** * @p.原创 2020-08-09 14:54:08 · 163 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?解题思路:最小值点进,当天大于最小值,则可卖可赚钱;1. 第i天能否卖? 前i-1天最小值 小于第i天时,能卖,可赚钱,记录赚钱为最大利润;2. 第i天是否进? 如果前i-1天最小值 大于当天时,可进,则当天为前i天最小值点;/** * @param {number[]} prices * @return {number} */va...原创 2020-08-09 14:07:33 · 152 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。解题思路:1. 暴力法,快慢指针,慢指针记录起点,快指针逐渐往后移动,同期记录最大值; 时间复杂度O(n^2)2. 动态规划,分而治之;当只有两个数时,包含第2个数的最大子数组,要么是这个数组本身或者最后一个数自己;i个数的数组,包含第i个数的最大子数组值为Dp[i] = max(Dp[i-1]+nums[i], nums[...原创 2020-08-09 13:47:35 · 142 阅读 · 1 评论 -
剑指 Offer 07. 重建二叉树
https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/submissions/输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解题思路:1. 前序遍历的第一个节点是根节点;2.前序遍历的第一个节点在中序遍历中的位置,确定该根节点的左子树节点个数 和子树个数;3. 通过左子树个数和右子树个数,可以从前序遍历中切割出左子树的前序遍历和右边子树的前序遍历;..原创 2020-08-08 15:56:32 · 135 阅读 · 0 评论 -
146. LRU缓存机制
146. LRU缓存机制运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间...原创 2020-08-06 15:44:05 · 142 阅读 · 0 评论 -
双指针问题
双指针中,快慢指针问题:1. 指针一快一慢,快指针按序遍历数组,慢指针记录有效数据位置。2. 当快指针找到有效数据时,慢指针才往前走一步;移除元素给你一个整数数组arr。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中1的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组/** * @param {number[]} nums * @param {number} val * @return {number}...原创 2020-08-02 15:24:07 · 345 阅读 · 0 评论 -
5476. 找出数组游戏的赢家
https://leetcode-cn.com/problems/find-the-winner-of-an-array-game/给你一个由 不同 整数组成的整数数组 arr 和一个整数 k 。每回合游戏都在数组的前两个元素(即 arr[0] 和 arr[1] )之间进行。比较 arr[0] 与 arr[1] 的大小,较大的整数将会取得这一回合的胜利并保留在位置 0 ,较小的整数移至数组的末尾。当一个整数赢得 k 个连续回合时,游戏结束,该整数就是比赛的 赢家 。返回赢得比赛的整数。题目数原创 2020-08-02 13:32:30 · 268 阅读 · 0 评论 -
词典中最长的单词
https://leetcode-cn.com/problems/longest-word-in-dictionary/给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。解答:1. 先建立字典树,字典树建立时,同一个父节点下,根据字母的assic 码判断子节点字母先后顺序。2. js 字符使用charCodeAt() 获取字符as.原创 2020-08-01 23:07:21 · 348 阅读 · 0 评论 -
丑数
丑数,只包含因子2,3,5的正整数被称作丑数,另外1 也是丑数。原创 2018-07-01 22:13:51 · 149 阅读 · 0 评论 -
众数
众数,顾名思义出现次数多的数,在leetcode定义的是指在长度为n 的数组中出现次数大于 n / 2的元素(假设总有一个)。求众数,暴力方法就是遍历数组,用一个Map 统计各元素出现的次数。若只求其中一个众数,在遍历时可以顺便判断,当前元素出现的次数是否已经超过一半,若是直接返回就可以。这种算法,最坏的情况,时间复杂度为O(n), 空间复杂度也为O(n);var majorityElement ...原创 2018-07-04 01:07:04 · 889 阅读 · 0 评论 -
完美数
完美数,又称完全数,对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。首先理解下什么是正因子。(呃,初中知识,百度了一下解释)“假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子。 需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立。反过来说,我们称n为m的倍数。” 正因子就是为正数的因子了。根据上面的解释,要判断一个数是不是完美数...原创 2018-07-04 01:26:22 · 1494 阅读 · 0 评论 -
784. 字母大小写全排列 & 17. 电话号码的字母组合
题目:给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。看题目这是一个回溯算法题,但是本文并没有采用回溯算法,而是使用了空间换时间的思路。开辟一个矩阵,存储每一位可能的值。然后从前往后集合组装。/** * @param {string} S * @return {string[]} */var letter...原创 2019-04-10 00:15:26 · 282 阅读 · 0 评论 -
增加和搜索单词
题目:https://leetcode-cn.com/problems/add-and-search-word-data-structure-design/思路:1. add 时采用回溯建立前缀树,在单词的最后一个字符增加完时,标记节点isWord=true;2. search是采用回溯遍历前缀树3. search时遇到“.” 字符,遍历所有子节点,直到找到。4.search ...原创 2019-04-22 00:08:17 · 161 阅读 · 0 评论 -
计算各个位数不同的数字个数
题目:https://leetcode-cn.com/problems/count-numbers-with-unique-digits/submissions/给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n。1. 首先想到的是暴力版本:从0开始遍历到 10**n,判断每个数字的每一位是否被重复,没有则计数+1;显然这种方法遇到大量数据时...原创 2019-04-25 23:28:54 · 1280 阅读 · 0 评论 -
格雷编码序列
定义:格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。格雷编码转二进制:G(i) = i ^ (i / 2) = i ^ (i >> 1)n 位数的格雷数最大值为:(1 << n ) -1;因此求一个n 位的格雷编码序列,即将G(0) 到 G((1 << n ) -1) 逐一转二进制数:/** * @...原创 2019-04-14 23:51:08 · 1958 阅读 · 0 评论 -
复原IP地址
题目:从字符串复原可能的IP地址。分析: IP地址的特点IP地址具有如下特点:由32个二进制位表示,每8位二进制数为一个整数,中间由小数点间隔,整个IP地址空间有4组8位二进制数,如“255.255.11.135”。也就是说,IP地址的每组数最大为2^8 -1,即255,最小为0.采用回溯算法,从左往右分割字符串,穷举所有可能的 4组组合。每个节点的解空间为:从剩余的字符串取有效的...原创 2019-04-18 00:22:14 · 352 阅读 · 0 评论 -
解码方法
题目:https://leetcode-cn.com/problems/decode-ways/一条包含字母A-Z的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。这道题一开始想到的是回溯算法,但是执行到239题时超时。回溯算法思路:从左往右,穷举所有可能的组合...原创 2019-05-28 01:05:30 · 3453 阅读 · 0 评论 -
回文
回文(palindrome),不是指回族文字(原创 2018-07-01 01:48:28 · 7360 阅读 · 1 评论