算法
浪狼浪狼浪
这个作者很懒,什么都没留下…
展开
-
动态规划- Jump Game
多步到达:将距离i拆分为2段,左边距离k,右边i-1, 距离i可达的问题转换为了i位置k距离可达,和 j+k位置i-k距离可达, 即 dp[i][j] = dp[j][k] && dp[j+k][i-k]。由于是递增计算距离i是否可达,所以在计算 dp[i][j] 时, dp[j][k] 和 dp[j+k][i-k] 已经计算过。一步到达:遍历输入数组arr, 标记j位置后距离i=1~arr[j-1]个位置可达, 即 dp[j][i] = true。原创 2023-03-07 23:24:19 · 170 阅读 · 0 评论 -
动态规划 -Maximum Subarray
子数组长度为i>=2时,子数组之和为同样开始位置i-1长度子数组的值加上i长度子数组最后一个元素的值。即 dp[j][i] = dp[j][i-1] + arr[j-1 + i-1];构造dp数组, dp[j][i] 代表从j位置开始i长度的子数组的sum值。记录长度i为1的数组和为此位置元素的值。即 dp[j][1] = arr[j-1]计算dp过程中,记录dp[j][i]的最大值即为子数组的最大和值。这里避免重复计算的过程是当前子数组长度-1的子数组求和过程。原创 2023-03-07 00:38:22 · 119 阅读 · 0 评论 -
动态规划 - Kth Missing Positive Number
构造dp[2...arr.length], dp[i] 跳过的数字数量为 i-1 位置跳过的数字数量 加上 arr[i]-arr[i-1]-1。即dp[i-1] + arr[i-1] - arr[i-2] -1。构造dp[1], 第1个位置跳过的数字为 arr[i]-1 即 dp[i] = arr[i]-1。在第1个数字和最后一个数字之间, 返回 arr[i-1 -1] + (k - dp[i-1])构造dp一维数组, dp[i] 表示i位置之前跳过的数字总数。在第1个数字左边,直接返回k。原创 2023-03-06 23:08:16 · 117 阅读 · 0 评论 -
动态规划- jump game 2
如果不能直接触达,则拆分为2个子问题, 将长度 i 分为2部分, 左边长度为k, 右边为i-k+1(这里跳板共用了1个位置所以+1)。即 step = dp[j][k] + dp[j+k-1][i-k+1];遍历数组,nums[j] 一步可以触达的位置,在j位置后 nums[j] 个位置, 对应j位置长度i取值2~nums[j-1]+1 最小步数为1 ,即 dp[j][2~nums[j-1]+1] = 1 . 这里需要考虑范围越界的情况。这里实际上已经记录了所有位置可触达的长度为2的情况的最小步数。原创 2023-03-05 20:19:45 · 85 阅读 · 0 评论 -
动态规划 - WildcardMatching
思路基本一致,不同点在于此题的 '*' ,可以与空匹配, 即 输入串s[1,j] 与 pattern串 p[1,i] 匹配的话, 如果i+1位置为'*', 那么s[1,j] 也与 p[1,i+1] 匹配。原创 2023-03-05 00:07:52 · 61 阅读 · 0 评论 -
动态规划 - 收集雨水
计算方式为从第1个位置记录高度大于i的位置, 每2个位置之间的空格数,即为这2个位置之间能容纳的雨水数。从前向后遍历, 可容纳的雨水数累加即为此高度当前位置能容纳的最大雨水数。1.①与1.②之和, 即为i高度/j位置的最大雨水数量 dp[i][j]构造dp数组, dp[i][j]代表i高度,j位置能收集到的雨水之和。② 比i高度低的j位置能容纳的雨水之和, 即 dp[i-1][j]① 当前高度i,这一行能收集的雨水之和。原创 2023-03-04 15:25:52 · 83 阅读 · 0 评论 -
动态规划 - 括号匹配
【代码】动态规划 - 括号匹配。原创 2023-03-04 13:28:01 · 191 阅读 · 0 评论 -
动态规划 - 正则匹配
构造boolean dp数组,数组[i][j]的含义为长度为 i 的patter子串, 与长度为 j 的输入子串,是否相匹配。= '.', 那么对于后续连续位置的 s[j] == p[i-1], 均匹配。p[i-1] == '.', 那么对于后续任意位置的s[j...s.length],均匹配。= '*', p[i] == s[i]时匹配。p[i] == '.', 那么对任意 s[j] , 均匹配。原创 2023-03-03 20:51:44 · 118 阅读 · 0 评论 -
动态规划 - 生成括号
n>=2时, 将括号()套在合适的地方。这些地方的位置j取值0~n-1, 代表被套住的左边一半, 即dp[j] , 右边一半没套住的则为 dp[n-1-j] . 左边一半和右边一半, 各自有多种可能, 即在此长度下的所有括号对组合。那么对应n对括号, 有len(dp[j]) * len(dp[n-1-j]) 种可能结果。构造dp二维数组, 第一维为n的所有可能取值即括号对数,第二位为当前括号对数的所有可能组合。n=0 时, 无括号 dp[0] = [];原创 2023-03-02 23:37:04 · 160 阅读 · 0 评论 -
动态规划 - 最长回文子字符串
任意长度的回文子串,都可以去除两边的相等字符串(更高层的子问题),最终得到长度为1或2的最短回文字符串。更长的回文字符串可以从长度为1或2的回文串拓展两侧相同字符得到。对于子串长度i>3,位置为j的情况, 可以通过长度为dp[i-2][j+1]=true 加上s[j] = s[j][j+i-1] 来判定为回文。处理上述步骤1的情况, 构造子串长度为1或2时的dp数组。长度为1统统设回文为true 即 dp[1][j]=true,长度为2的两个字符相等也设置回文为true 即 dp[2][j]=true。原创 2023-03-02 00:59:51 · 176 阅读 · 0 评论 -
动态规划 - 最长公共子序列
s1 的i位置字符与 s2的 j 位置字符不同,那么 s1 [0,i] 和 s2[0,j] 最长公共子字符串,即为s1[0,i-1] 与 s2[0,j-1] 最长公共子字符串 里更长的那一个。dp[i][j] = max(dp[i-1][j], dp[i][j-1])s1 的i位置字符与 s2的 j 位置字符相同, 那么 s1 [0,i] 和 s2[0,j] 最长公共子字符串,即为s1[0,i-1] 与 s2[0,j-1] 最长公共子字符串 + s1[i] (同s2[j])。计算最长公共子字符串。原创 2023-03-01 22:53:35 · 174 阅读 · 1 评论 -
simhash算法
simhash算法适用场景检测文本相似度。优势整段文字计算哈希值比较文本相似度的方式,对于句中少量变更的情况,无法将两篇文章判定为相似的。因为这种方式,没有在结果中体现出局部的信息。simhash基于关键词信息,针对这种情况可以算出接近的哈希值,判定出两篇文章为相似内容。实现提取关键词-词频信息去除转义html encode去除StringEscapeUtils.unescapeHtml4(text)去除符号text.replaceAll("[^\\u4E00-\\u9FFFa-z原创 2020-08-31 21:10:04 · 201 阅读 · 0 评论 -
算法学习笔记 2.2分治
学习章节: 2.2分治学习内容:1、棋盘覆盖 在2^k * 2^k的棋盘中, 有一格被标记, 现要求用占3小格的'L'将棋盘完全覆盖并且不能重叠,求覆盖方法。代码实现:#include static int count = 0;static int Board[8][8] = {0};void ChessBoard(int lr, int l原创 2013-09-27 00:29:07 · 521 阅读 · 0 评论 -
算法学习笔记 2.1递归
学习教材:计算机算法设计与分析(王晓东) 第四版学习章节:2.1递归学习内容:1、排列问题 求出集合X中第m到第n个连续元素的全排列。 代码实现:#include void Swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp;}vo原创 2013-09-26 02:22:24 · 524 阅读 · 0 评论