![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
-参考github上分享的leetcode推荐题目
-做编程练习
-总结思考
J_learner
这个作者很懒,什么都没留下…
展开
-
JavaScript|LeetCode|数学|204. 计数质数
看了题解想法:访问到一个质数时,结果加 1,同时将能被该质数整除的数排除(不是质数)/** * @param {number} n * @return {number} */var countPrimes = function(n) { // 题解:埃拉托斯特尼筛法在每次找到一个素数时,将能被素数整除的数排除掉。 var notPrime = [], i = 0, j = 0, ans = 0; for(i = 0; i < n; i+原创 2020-05-25 11:17:59 · 171 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划/递归|650. 只有两个键的键盘
法1:动态规划想法:copy all 算 1 次操作;paste 算 1 次操作数组 dp:dp[i] 表示打印出 i 个 ‘A’ 的最少操作次数。从前向后更新 dp :找 i % j == 0 中,j 的最大值(n >= i > j >= 1)dp[i] = dp[j] + 1 + (i / j - 1)dp[j]表示得到 j 个 A 所需的最少操作次数;1 表示 copy 这 j 个 A,(i / j - 1) 表示 paste 的次数(本身已经存在一份 j 个 A,原创 2020-05-18 12:20:30 · 182 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|72. 编辑距离
法1:动态规划想法:先看看题目给的例子:word1 = “horse”, word2 = “ros”初始化:每增加一行,表示指向 word1 的指针(i)向后移动一个字符;每增加一列,表示指向 word2 的指针(j)向后移动一个字符;当一个字符串为空时,另一个串只需要不断删除字符即可;假设填写数字的部分为 dp 数组,里面的数字为使得 word1 和 word2 当前字符串(即从第 0 位到各自指针指向的位置)相等的最小操作数进行表格的填写,发现规律对于dp[1][1],因为word1[原创 2020-05-15 12:05:21 · 312 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|583. 两个字符串的删除操作
法1:动态规划想法:参见 JavaScript|LeetCode|动态规划|1143. 最长公共子序列假设 word1 和 word2 的最长公共子序列长度为 L最小步数 = word1.length - L + word2.length - L/** * @param {string} word1 * @param {string} word2 * @return {number} */var minDistance = function(word1, word2) {原创 2020-05-14 12:17:10 · 248 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|188. 买卖股票的最佳时机 IV
法1:动态规划想法:参见 JavaScript|LeetCode|动态规划|123. 买卖股票的最佳时机 III 的优化部分该题中,规定了最多交易次数 k用数组 buy 和 sell 来表示第 1 ~ k 次 买入 和 卖出 的最大收益prices的长度对于交易次数有限制,故更新k的值: k = Math.min(k, prices.length / 2 向上取整)修改(尽可能缩小) k 的值,有利于节省内存、缩短运行时间/** * @param {number} k *原创 2020-05-14 10:53:24 · 144 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|123. 买卖股票的最佳时机 III
法1:动态规划想法:A[i]:第 i 天买入的最大利润;B[i]:第 i 天卖出的最大利润A[i][0] 表示在第 i 天 第 0 次买入B[i][0] 表示在第 i 天 第 0 次卖出依次类推第 0 次卖出 -> 第 1 次买入 -> 第 1 次卖出 -> 第 2 次买入 -> 第 2 次卖出最大利润在:第 0 次卖出 / 第 1 次卖出 / 第 2 次卖出 时取得/** * @param {number[]} prices * @return {n原创 2020-05-13 10:52:04 · 221 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|714. 买卖股票的最佳时机含手续费
法1:动态规划想法:数组dp保存每一天的利润最大值在第 i 天,对于第 j (j < i)天的股票:dp[i]=Math.max(dp[i],dp[j]+prices[i]−prices[j]−fee,dp[j])dp[i] = Math.max(dp[i], dp[j] + prices[i] - prices[j] - fee, dp[j])dp[i]=Math.max(dp[i...原创 2020-05-08 10:39:49 · 270 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|309. 最佳买卖股票时机含冷冻期
法1:动态规划想法1:第 i 天时,将 prices[i] 与 prices[j] (j < i) 比较,意思是:在第 j 天买入,第 i 天卖出(也可能是第 j 天正持有一只股票,而不是购入新股)。会有以下两种情况出现prices[j] > prices[j - 1]:那么在第 j 天持有股票,或可以买入股票。dp[i]=Math.max(dp[i],dp[j]+pri...原创 2020-05-07 11:36:15 · 218 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|377. 组合总和 Ⅳ
法1:动态规划想法:target 为背包nums 中的正整数为物品,正整数的值为物品体积,物品可以无限次放入dp数组保存目标数为 0 到 target 时的组合个数(初始化dp[0]为1,方便后续组合个数的计算。比如:如果 target 存在于 nums 中,则正好装得下,dp[target]++;因为都采取的dp[target] + 剩余容量组合数(此时剩余容量为0),所以dp[tar...原创 2020-05-04 11:22:51 · 154 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划/BFS|139. 单词拆分
法1:动态规划想法:字符串 s 是背包单词列表 wordDict 中的单词是物品物品可重复放入背包数组dp:dp[i]表示:s 中以 s[0] 开头的 i 长度的子串 代表的 背包,是否可正好被单词装满/** * @param {string} s * @param {string[]} wordDict * @return {boolean} */var word...原创 2020-05-01 11:33:30 · 195 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|518. 零钱兑换 II
法1:动态规划看了题解想法:数组dp,保存背包容量为0到amount时,用硬币装满背包的方式数动态规划关注于当下;思考:对于当前面额硬币装或者不装?(是否能装下?是否应该装?)对于数组dp从前往后更新,可实现同一面额硬币多次装入/** * @param {number} amount * @param {number[]} coins * @return {number} ...原创 2020-04-29 11:50:43 · 214 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|322. 零钱兑换
法1:动态规划看了题解想法:总金额amount是背包容量coins是物品(coins.length是物品种类;coins[i]为每种物品的体积)每种物品有无限个目标:用最少数量的物品把背包填满/** * @param {number[]} coins * @param {number} amount * @return {number} */var coinChange...原创 2020-04-29 11:30:09 · 386 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|474. 一和零
法1:动态规划看了题解想法:0 和 1 是两个背包,m 是 0 背包的容量,n 是 1 背包的容量字符串是物品需要当前物品的 0 和 1 都可以被装下,才可以放得进背包(仍然存在选择:如果放入之后,总的字符串数量最大,则放入;否则不放入)背包的容量越大,越可能放入更多的物品,所以最后返回dp[m][n]/** * @param {string[]} strs * @param...原创 2020-04-22 11:04:42 · 154 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划/递归|494. 目标和
法1:动态规划看了题解想法:思考:什么是背包?什么是物品?将nums分为P(加+)和N(加-)两部分sums( P ) + sums( N ) = sums(nums)sums( P ) - sums( N ) = S=> sums( P ) = (sums(nums) + S) / 2则只需要选取数组中元素加入背包(这些数前面加+),使得背包正好被装满;求装满的方法...原创 2020-04-20 11:21:46 · 160 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|416. 分割等和子集
法1:动态规划想法:将两个子集看作背包(容量均为数组元素和 / 2),数组中的数字作为物品(每个数字的值作为每个物品的体积)问题:如何使得两个背包背的物品体积相等呢? 回答:只需要使得一个背包可以正好装满即可!数组dp表示:容量为0~(数组元素和 / 2)的背包,可以容纳的物品的最大体积和/** * @param {number[]} nums * @return {boolea...原创 2020-04-16 10:17:58 · 219 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|1143. 最长公共子序列
法1:动态规划看了题解推荐去看 力扣 的该题题解想法:创建数组dp:dp[i][j]保存text1前i个、text2前j个字符中的两者的最长公共子序列;dp[0][j]和dp[i][0]均为0,因为此时表示text1或text2取空字符串时/** * @param {string} text1* @param {string} text2 * @return {number} ...原创 2020-04-13 14:33:05 · 287 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划/贪心思想|376. 摆动序列
法1:动态规划想法1:数组dp保存以nums[i]结尾的摆动序列的最长子序列长度数组larger保存以nums[i]结尾的摆动序列的最长子序列中:nums[i]比前一个数小/大:false表示小,true表示大(用于判断当前数能否衔接到nums[i]之后)/** * @param {number[]} nums * @return {number} */var wiggleMa...原创 2020-04-10 12:29:22 · 174 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划/贪心算法|646. 最长数对链
法1:动态规划看了题解想法:对所有数对pairs:按照每个数对的第一个数进行升序排列数组dp保存以pairs[i]结尾的最长数对链的长度dp[i]的值:若pairs[i][0] > pairs[j][1] (i > j),则dp[i] = dp[j] + 1;否则,dp[i] = dp[i];注:dp[j] >= dp[k] (j > k)/** ...原创 2020-04-08 15:56:35 · 168 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|300.最长上升子序列
法1:动态规划想法:用数组dp保存:以nums[i]结尾的最长上升子序列长度对于nums中每个数,dp[i]初始化为1,至少包含nums[i]本身对于nums[i],要求dp[i],关键在于:找到dp[j],nums[j] < nums[i] (j < i),则dp[i] = dp[j] + dp[i]。注:需找到符合条件的dp[j]的最大值最长上升子序列可能以 nums[...原创 2020-04-03 11:27:52 · 244 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|91.解码方法
法1:动态规划想法:用数组dp保存以当前数字字符结尾的串的解码方法总数对于当前数字字符s[i],若s[i - 1]s[i]衔接而成的数字可解码(即 >=1 且 <= 26),则dp[i] = dp[i - 2] + dp[i - 1](dp[i - 2]表示s[i - 1]s[i]一起解码,再加上s[i - 1]之前的字符的解码数;dp[i - 1]表示s[i]单独解码,再加上...原创 2020-04-02 15:37:26 · 165 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划/BFS|279.完全平方数
法1:动态规划想法:数组dp保存当n = 1, 2, 3, ……时,将n分割成多个完全平方数的 完全平方数个数(最少个数)如果 i 是完全平方数,则dp[i] = 1如果 i 不是完全平方数,则dp[i] = min{dp[i], dp[i - j] + dp[j]}:将 i 分为两部分(j = 1 ~ i - 1),各部分可能也会被分割,但:动态规划无需考虑如何来,只需考虑结果如何(只...原创 2020-04-01 19:42:42 · 268 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|343.整数拆分
法1:动态规划看了题解想法:“给定一个正整数 n,将其拆分为至少两个正整数的和”。则 n >= 2用数组dp保存整数 1 ~ n 经拆分后的最大乘积(后续需用到dp[1] = 1,比如 3 = 1 + 2)拆分整数 i 时,先将其拆分为 i - j 和 j;最大值在下面几种情况中产生:(i - j) * j:即 i - j 和 j 均不再拆分dp[i - j] * dp[...原创 2020-03-30 11:57:47 · 465 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|413.等差数列划分
法1:动态规划看了题解想法:例如数组:A = [1,2,3,4]等差数列至少有3个元素,故考虑以A[2]、A[3]结尾的等差数列。以A[2]结尾的等差数列:[1,2,3] (A[2] - A[1] == A[1] - A[0])以A[3]结尾的等差数列:[2,3,4] (A[3] - A[2] == A[2] - A[1])因为A[3]与A[2]、A[1]成等差数列,又A...原创 2020-03-27 11:12:15 · 174 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|303.区域和检索-数组不可变
法1:动态规划看了题解想法:索引 i 到 j 的元素和(含 i、j)= (索引 0 到 j 的元素和)-(索引 0 到 i - 1 的元素和)用一个数组sum保存索引 0 到 j 的元素和(j = 0, 1, 2, ……, n - 1)若 i == 0,则直接返回sum[ j ]/** * @param {number[]} nums */var NumArray = ...原创 2020-03-26 10:30:53 · 201 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|62.不同路径
法1:动态规划方法类同JavaScript|LeetCode|动态规划|64.最小路径和 法2想法:使用一个一维数组dp,来保存到达当前行的每个网格的不同路径数到达第一行或第一列的每个网格的不同路径数目均为1到达其他网格的不同路径数目:当前网格上面的一个网格、当前网格左面的一个网格,到达这两者的不同路径数之和/** * @param {number} m * @param {n...原创 2020-03-22 11:05:50 · 218 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|64.最小路径和
法1:动态规划(未优化版)想法:对于第 i 行、第 j 列位置,从左上角到此位置的最小路径为:dp[i][j] = grid[i][j] + min{dp[i - 1][j] , dp[i][j - 1]}dp[i - 1][j] 表示从上走到下到达[i][j];dp[i][j - 1]表示从左走到右到达[i][j]/** * @param {number[][]} grid* ...原创 2020-03-21 12:31:23 · 205 阅读 · 0 评论 -
JavaScript|LeetCode|动态规划|213.打家劫舍Ⅱ
法1:动态规划看了答案想法:结果分两种情况讨论:不含最后一个房屋:这样第一个房屋可以被包含。(“可以”,而不是“一定”)不含第一个房屋针对以上两个情况,可分别进行最高金额求解(即LeetCode 198.打家劫舍)。取最大值,即为结果/** * @param {number[]} nums * @return {number} */var rob = functi...原创 2020-03-20 11:17:40 · 179 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|51.N皇后
法1:回溯通过之后看了答案,改进了一下想法:依次在每行放皇后,row(已经到了第row行,此时第0行到row - 1行都放了皇后,即现在已经放了row个皇后)== n,则将此时的board(放皇后的棋盘)放入答案因为按行依次放皇后,所以不会有多个皇后在同行,只需考虑同列,左上到右下,左下到右上同列:visitedC[]数组标记,其中有n个元素左上到右下:同一线上元素下标特征:(行...原创 2020-03-15 17:29:46 · 195 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|37.解数独
法1:回溯想法:遍历数独中每一个空白格,依次填入1~9,每一次填入都要检验其合法性(即行、列、3×3宫不重复),不合法则变回’.’(对当前空白格填入1到9均不合法,则说明前面的有些空白格填错了,回溯),合法则进入下一阶段从上一个填的空白格所在行开始检索(前面的行已经填了),与步骤1相同,依次填入1~9,合法则继续进行下一阶段,不合法则回溯/** * @param {character...原创 2020-03-15 11:49:05 · 101 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|78.子集
法1想法:结果集 = 当前元素 + 当前元素与之后剩余元素的子集的组合 + []陷阱:“当前元素与之后剩余元素的子集的组合”:当前元素应该与之后剩余元素的真子集组合,否则会出现重复组合(和空子集组合时)/** * @param {number[]} nums * @return {number[][]} */var subsets = function(nums) { ...原创 2020-03-11 15:39:58 · 169 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|216. 组合总和Ⅲ
法1想法:该题与JavaScript|LeetCode|搜索|39.组合总和、JavaScript|LeetCode|搜索|40.组合总和Ⅱ相似,根据题目描述的不同修改代码candidates自己创建,包含9~1递归结束的条件加上:k与组合长度的判断candidates中不包含重复的数字,所以无需通过判断candidates[i]是否等于candidates[i - 1]来剪枝...原创 2020-03-10 10:49:26 · 189 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|40.组合总和Ⅱ
法1:回溯想法:40.组合总和Ⅱ是JavaScript|LeetCode|搜索|39.组合总和的“变式”两者的解法基本相同,观察39.与40.的题目描述区别,给代码增加相应的限制“candidates 中的每个数字在每个组合中只能使用一次。”“解集不能包含重复的组合”所以:1)仍然将candidates降序排列;2)当前数字加入组合后,将当前数字之后的数字进行组合,以得到tar...原创 2020-03-10 10:29:59 · 134 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|39.组合总和
法1:回溯想法:将candidates降序排列,当前数字大于target,则不使用该数字作为组合的第一个数字(跳过该数字)遇到一个数字<=target,则对小于等于它的剩余数字进行组合,使得组合的和等于新的target,即target-该数字/** * @param {number[]} candidates * @param {number} target * @retu...原创 2020-03-09 11:54:00 · 190 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|77.组合
法1想法:大问题包含小问题,大小问题是同一种类型组合而非排列,那么某一组合出现之后,另一组合不能与其相同(元素完全相同)。如何保证?已经当了某一组合第一个元素的数字,不能在加入后面的组合中。因为从1到n,为升序排列,则优先小数字先当组合的第一个元素,然后得到剩余数字的组合,与该数字拼接。1到n的升序也保证了,前面已经加入的数字不会再次加入剩余数字的组合中/** * @param {n...原创 2020-03-09 11:24:13 · 160 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|47.全排列Ⅱ
法1:回溯想法:每一次函数调用,向temp中加入一个之前未加入temp的数字(因为nums中存在重复数字,所以需要另外使用一个arrived数字对应标记nums中数字是否已经加入了temp)全排列不重复,则需要判断当前符合条件的temp是否已经在结果output中注:可以先看一下:JavaScript|LeetCode|搜索|46.全排列/** * @param {number[]...原创 2020-03-08 12:02:00 · 206 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|46.全排列
法1:回溯想法:将访问到的数字加入临时数组temp继续访问nums中的数字,不在temp中的可加入(加入了temp相当于做了标记)尝试了各种陆续将各个数字加入temp的方式,且temp中数字无重复,各种方式得到的答案即为题目所求注:当前循环中,这一轮没有加入的数字,下一轮可能还会加入;或在调用的函数的循环中有可能加入,可以覆盖所有的情况/** * @param {number[]...原创 2020-03-08 09:49:49 · 196 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|257.二叉树的所有路径
法1:递归想法:大问题包含小问题,大小问题是同种问题找到root的左子树和右子树的所有可能路径(从左子树的根到叶子,从右子树的根到叶子)(分为left和right两类),分别与root衔接,得到最终结果找左子树的所有可能的路径(从左子树的根到叶子)(此时左子树的根为新的root’):找到root’的左子树和右子树的所有可能路径(分为left‘和right’两类),分别与root‘衔接,得...原创 2020-03-07 15:58:34 · 242 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|79.单词搜索
法1 DFS回溯想法:矩阵arrived记录矩阵board中某个字符是否被访问从矩阵board中找到word的第一个字符,将word截断,取除第一个字符之后的字符,组成leftWord然后找leftWord的第一个字符向word的第一个字符的位置的上下左右寻找有等于leftWord的第一个字符的位置,则以此位置为新起点,去除了leftWord的第一个字符的剩余字符leftWord...原创 2020-03-07 13:54:54 · 145 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|93.复原IP地址
法1:回溯看了答案想法:IP地址由4部分组成,四部分之间由 . 分隔,如:255.255.255.255(即11111111.11111111.11111111.11111111)每部分>=0 && 每部分<= 255每部分没有前导零当前IP地址已经有4部分 && 输入的字符串已访问完最后一位,则当前IP地址是答案之一,存入增加一个部分-...原创 2020-03-06 17:17:20 · 258 阅读 · 0 评论 -
JavaScript|LeetCode|搜索|17.电话号码的字母组合
法1:回溯backtracking看了答案想法:输出的各个字符串的长度等于输入的字符串长度输入的字符串长度相当于搜索树的深度(高度)当组成的字符串的长度等于输入字符串长度时,就应该将该字符串加入结果集中;然后将最后一个加入的字符¥删去,与和¥同组的字符再衔接组成新的字符串注:¥是一个字符代号;同组指的是在键盘上的同一按钮上/** * @param {string} digits ...原创 2020-03-06 11:58:23 · 239 阅读 · 0 评论