自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 Leetcoder Day43| 单调栈2

数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。可以看到本题本质依然是寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,接雨水这道题目,我们正需要寻找一个元素,右边最大元素以及左边最大元素,来计算雨水面积,所以还是可以考虑用到单调栈。本题看起来和接雨水很类似,都是求面积,但是接雨水是找每个柱子左右两边第一个大于该柱子高度的柱子,分别求宽和高然后相乘,而本题是找。那么问题的关键在于,如何判断柱子的左右边界?

2024-03-28 19:34:10 703

原创 Leetcoder Day43| 单调栈1

本题的意思是:有一长一短两个数组,短数组中的元素一定在长数组中出现过,但是两个数组的元素顺序不同,定义一个结果数组res,遍历短数组中的每一个元素,找出当前元素的值在长数组中的位置,在长数组的顺序中找出右边第一个更大的元素并返回这个元素的值,若右边没有更大的元素则返回-1。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。

2024-03-28 16:19:06 841

原创 机器学习复习手册

原因 是 K 取值小的时候(如 k==1),仅用较小的领域中的训练样本进行预测,模型 拟合能力比较强,决策就是只要紧跟着最近的训练样本(邻居)的结果。但是,当训练集包含”噪声样本“时,模型也很容易受这些噪声样本的影响出现过拟合情况,噪声样本在哪个位置,决策边界就会画到哪,这样会增大"学习" 的方差,也就是容易过拟合。K 值取值太大时,情况相反,容易欠拟合。(生成模型就是要学习 x 和 y 的联合概 率分布 P(x,y),然后根据贝叶斯公式来求得条件概率 P(y∣x),预测条件概率最大的y)。

2024-03-27 15:15:08 690

原创 Leetcoder Day42| 动态规划part09 打家劫舍问题

这里多了一个需要判断的条件就是:i是否为最后一个房子,如果是,则需要考虑第一个房子偷不偷的问题,如果第一个房子没有被选,则i 就只跟i-1是否被选有关系。本题思维和之前的打家劫舍是一样的,只不过数据形式换成了树,需要对树进行遍历,不能同时抢的条件变成抢了父亲节点就不能抢其对应的孩子节点,抢了孩子节点就不能抢对应的父亲节点。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

2024-03-07 20:36:28 1017

原创 Mac系统:mysql+jdk+neo4j

如图可以看到我的系统里有两个jdk版本,一个是之前从官网下载安装的jdk11,一个是为了使用springboot在IDEA上下载的jdk21,并且默认使用的是jdk21。之前因为我说过neo4j对于jdk版本要求比较严,我的neo4j应该使用jdk11,所以接下来我就需要从jdk21切换到jdk11,可以用如下命令行,这里JAVA_11_HOME和JAVA_21_HOME都是从上一步得到的结果粘过来的。查看当前默认使用的jdk版本,如果不知道自己的系统里有几个jdk,可以使用。1. 若密码被误改,遇到。

2024-03-07 15:49:56 537

原创 Leetcoder Day41| 动态规划part08 背包问题

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。本题还是完全背包问题,因为可以重复使用字典中的单词,所以这里物品就是单词,容量为字符串,此外还要定义一个集合,统计单词的起止位置。s⚠️: 内层需要通过来判断dp[j]的值是否已经为true,如果是,则不需要再进一步检查,可以跳出内部循环,继续遍历下一个位置。

2024-03-06 17:09:21 910

原创 Leetcoder Day40| 动态规划part07

本题和昨天的零钱兑换题设最大的区别在于,求所需的最少的硬币个数。因此当满足条件时:判断dp[j]和dp[j-coins[i]]+1谁更小,输出更小的。,因为但凡一个整数都可以被1累加到,所以不需要判断剩下的数是否为完全平方数。这里需要注意的地方是⚠️:首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;给你一个整数 n ,返回和为 n 的完全平方数的 最少数量。dp含义:本题dp[j]就是和为j的最小完全平方数量。递推公式:dp[j]=dp[j-i^2]+1。当j=1 时 dp[j]=1。

2024-03-06 16:45:38 935

原创 Leetcoder Day39| 动态规划part06 完全背包问题

所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)同样leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题,所以这里还是以纯完全背包问题进行讲解理论和原理。因此,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。

2024-03-06 15:02:16 944

原创 Leetcoder Day38| 动态规划part05 背包问题

还要注意几种特殊的情况:(target + sum) / 2 应该担心计算的过程中向下取整有没有影响,如果sum为5,target为2,那么无论怎样也不会到达target值,也就是说当sum+target为奇数时,是没有解决方案的。如果不能满足,因为sum/2是向下取整,所以sum-dp[target]一定大于dp[target],所以相撞以后剩下的石头重量为(sum-dp[target])-dp[target]其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。

2024-03-04 11:00:49 942

原创 Leetcoder Day37| 动态规划part04 背包问题

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。i是由i-1推出来的,所以i为0的时候就一定要初始化。刚才讨论过j=0的情况,那么i=0时,dp[0][j],即:存放编号0的物品时,各个容量的背包所能存放的最大价值。因此 j < weight[0]时,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。若j>=weight[0],dp[0][j]的值为value[0]。

2024-03-03 17:57:05 973 1

原创 Leetcoder Day36| 动态规划part03

⚠️本题的优化思路:其实将对于j的遍历条件改为: j<i-1可以节省一步计算,因为如果让j=i-1,其实在 j = 1的时候,这一步就已经拆出来了,属于重复计算,所以 j < i - 1。因为拆分一个数i使之乘积最大,比如i=x+(i-x) dp[i]=x(i-x)=xi-x^2,这时是一个向下的抛物线,最大点为x/2。返回你可以获得的最大乘积。即dp[3]=dp[2]*dp[0]+dp[1]*dp[1]+dp[0]*dp[2] ,本题需要注意的是,至少拆成2个正整数的和,而不是正好是2个正整数。

2024-03-03 16:02:27 880

原创 Leetcoder Day35| 动态规划part02

因为本题要求有多少条从起点到终点的可能路径,这里需要定义的是一个二维数组,因为坐标包括两个值,start为[0,0],end为[m-1, n-1]。所以到终点end的时候,上一步只能是来自其左边或者上边,所以end的位置只能来自(m-2, n-1)或(m-1, n-2)。本意跟上一题不用路径的区别在于,这里多了障碍物的限制条件,因此当存在障碍物的时候,这条路径就被去掉即可,因此初始化和遍历时,都需要多加一个判断障碍物的条件,如果(i,j)位置有障碍物,就为0。1. 向右 -> 向下 -> 向下。

2024-03-02 23:43:03 490

原创 Leetcoder Day34| 动态规划part01

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划的每一个状态一定是从上一个状态推导出来的,这一点有别于贪心算法,贪心是从局部直接选择最优,不需要推导。比如背包问题:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。贪心算法思路:每次拿物品选一个最大的或者最小的就完事了,和上一个状态没有关系。

2024-03-02 17:00:53 952

原创 Leetcoder Day33| 贪心算法part06+总结

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x

2024-03-01 20:06:40 562

原创 Leetcoder Day32| 贪心算法part05

依旧是重叠区间问题,先按照start排序,再进行重叠判断,本题相邻区域也算重叠,因此若intervals[i][0]

2024-03-01 14:52:54 599

原创 基于语义解析的KBQA——代码和论文详细分析

提供阅读本文的前提知识,引用自Semantic Parsing on Freebase from Question-Answer Pairs这篇论文。

2024-03-01 03:07:11 1156

原创 Leetcoder Day31| 贪心算法part04

在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。上面是我自己的思路,但是运行的时候有一些案例没有通过,在于起点更新错了,要判断当前气球的终止坐标和前一个气球的终止坐标谁小,因为。,因为第一个数值表示该人的身高,目前已经按照前面比该人高的顺序排完序,因此如果第一个值不相等的情况下,值大的优先排在前面。

2024-02-29 19:52:08 1007

原创 Leetcoder Day29| 贪心算法part03

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。如果当前数组元素存在负数,从绝对值最大的负数开始都取反为正数,若还有剩余,剩下的若为奇数,挑最小的来进行取反,若为偶数,则无所谓。如果当前数组元素均为正数,且K为奇数时,操作最小的那个,如果为偶数,则操作谁都无所谓。以这种方式修改数组后,返回数组可能的最大和。本题可以操作同一个索引多次,因此。因此可以将数组先进行排序。

2024-02-28 17:52:15 821

原创 Leetcoder Day28| 贪心算法part02

上一题中,我们总结重要的是要看覆盖的范围并且进行更新,这次我们关键是要看什么时候给步数+1,最直接的想法就是每次都走当前位置所能覆盖的最大步数。比如 [7,1,5,3,6,4],每天的利润为[-6, 4, -2, 3, -2],因为买卖的区间为第2-3天,第4-5天,总利润为4+3=7。每次下标i都在cover的范围内移动,每移动一个元素,cover就会进行判断是否当前元素覆盖的范围大于之前的cover值,如果大于则更新cover,如果cover大于或等于最后一个元素的下标,则表示可以达到最后的位置。

2024-02-28 16:22:14 976

原创 Leetcoder Day27| 贪心算法part01

可以用局部最优退出全局最优,并且想不到反例到情况。

2024-02-28 15:13:48 1016

原创 Leetcoder Day26| 回溯part06:总结+三道hard题

回溯部分涉及到的题型比较多,而且在二叉树环节也用到了回溯。回溯的问题都可以抽象为树结构,并且其本质是递归,也就是,只要有递归就会有回溯!这次刷题从代码随想录里学到了很有用的回溯模板,但是也不能只依赖于套模板,要具体问题具体分析。组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等void backtracking(参数) {

2024-02-27 21:11:09 1184

原创 Leetcoder Day25| 回溯part05:子集+排列

排列问题不需要使用startIdx因为可以存在重复取值的情况,比如第一次1被取过,形成[1,2,3],后面还可以再取组成[2,1,3],但是需要设置一个数组used来记录当前元素在同一path中是否使用过。从上图可以看到,如果在同一个父节点下,同一树层使用过的元素便不再取,如果所取元素小于子序列最后一个元素,也不符合条件。本题和上一题的区别在于有重复的数字,所以需要去重,先对数组进行排序,设置used数组记录是否使用过如果used[i-1]为true,说明同一树枝上使用过值一样的元素;

2024-02-27 18:50:38 1032

原创 基于语义解析的KBQA论文

简单KBQATemplate-based question answering over RDF data.Unger, Christina, Lorenz Bühmann, Jens Lehmann, A. N. Ngomo, D. Gerber, P. Cimiano. WWW(2012). [PDF] Large-scale semantic parsing via schema matching and lexicon extension.Qingqing Cai, Alexander Y

2024-02-26 20:15:05 829

原创 Leetcoder Day24| 回溯part04:组合+分割

示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]本题其实和组合中,需要将重复的子串去掉思路一样,没有什么其他的新知识点,但是我在写代码的时候犯了一个错误:在进行重复树层判断的时候,写成了i>0,这样就会少计算一些子集。在循环中,如果子串合法,则在i+1的位置上插入一个‘.’,然后将point+1,后面递归的位置则是i+2,因为i+1的地方已经是一个符号了。

2024-02-26 17:18:10 936

原创 Leetcoder Day23| 回溯part03:组合+分割

1.如果是一个集合来求组合,就需要,如果是多个集合取组合,就不需要。2.什么时候在调用递归backTracking ()的时候+1:如果不可以重复,则需要+1,否则不用+140.组合总和II给定一个候选人编号的集合candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每个组合中只能使用一次。解集不能包含重复的组合。

2024-02-26 15:52:39 991

原创 Leetcoder Day22| 回溯part02:组合总和+字母组合

本题和上一章组合题基本类似,就是这里限制了组合的范围为[1,9]所以相当于在循环中需要用9来限制循环次数。这里递归结束条件就是找到了和为n的k个数的组合,因此可以设置一个sum惨参数来计算当前的和。剪枝操作在循环条件中和上一题是一致的,就是用9-(path.size())+1,这里还要注意一个隐藏条件,如果当前的sum已经大于要求的n,也可以停止循环了。找出所有相加之和为 n 的 k 个数的组合。示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

2024-02-26 13:34:11 323

原创 Leetcoder Day21| 回溯理论基础+组合

这棵树一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。

2024-02-24 15:26:29 1050

原创 Leetcoder Day20| 二叉树 part09+总结

这道题的题设读起来比较拗口,翻译一下就是如果二叉树中有节点的值大于等于当前的节点,便将那些值累加变成当前节点新的值。这道题思路就比较简单,二叉搜索树的中序遍历本身就是有序数组,所以反过来将有序数组按照中序构建即为二叉搜索树。当遇到边界外的值,就进行删除,如果比low小,则将当前根节点及其左子树都删除,返回其右子树;改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。

2024-02-23 15:27:34 482

原创 Leetcoder Day19| 二叉树 part08

因此如果要找到最近的公共祖先,如下面的图所示,节点5位于p和q之间,如果继续向左或向右遍历,则错过了成为p或者q的祖先,因此5就是q和p的最近公共祖先。所以按照从上往下的顺序遍历,第一次遇到数值在p和q之间的,就是最近公共祖先。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。本题较简单的一个思路就是,判断待插入的值和根节点的关系,,然后将待插入的元素始终作为叶子节点插入即可。这两天完成了对二叉搜索树的增删还有搜索的操作,一定要记住二叉搜索树的特点,不需要遍历整棵二叉树。

2024-02-23 14:12:59 1161

原创 Leetcoder Day18| 二叉树 part07

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:遇到二叉搜索树,就要想到中序遍历是有序的,因此依然可以将二叉搜索树转换为中序遍历数组求解。给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。例如:给定 BST [1,null,2,2],⚠️注意最后findMode返回的是一个整数数组 (int[]),所以在定义res时,一定也要定义的是一个数组而不是一个整数。

2024-02-22 19:14:11 1007 1

原创 Leetcoder Day17| 二叉树 part06

这道题我的第一个想法是建立一个哈希表,层次遍历并存储第一个树的位置和值,如果该位置没有节点则为-1,随后创建新的节点,遍历第二个树,若当前位置已经有节点,则将两个节点值相加返回;注意在Java中,如果将树转换为列表List,则需要用.get和size()来获取列表的值和长度,如果是数组,因为不知道树的节点个数,所以需要先设置一个很大的值,所以也可以先将树转换为列表,再将列表转换为数组。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

2024-02-22 17:19:01 1036 1

原创 Leetcoder Day16| 二叉树 part05

(2)

2024-02-19 16:01:30 1024 1

原创 Leetcoder Day15| 二叉树 part04

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。truefalse这道题还是跟求最大深度有相似之处,求每个左子树和右子树高度差,如果有一对已经不满足了就返回false。因为getDepth返回的是高度,所以当不满足条件的时候,返回-1。给定一个二叉树,返回所有从根节点到叶子节点的路径。由于本题需要输出从根节点到叶子结点的路径,因此适合使用前序遍历,这样可以让父节点指向左右孩子节点找到路径。

2024-02-19 14:29:48 940 1

原创 Leetcoder Day14|二叉树part03

一般来讲,求高度用前序遍历,求深度用后序遍历,但是如果涉及到一棵树的最大最小深度时,可以将其转换为求根节点的高度,使用后序遍历来进行求解。

2024-02-19 12:35:36 1028 1

原创 Leetcoder Day13| 二叉树 part02

因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。参数就是要传入节点的指针,题目中给出的要返回root节点的指针,可以直接使用题目定义好的函数,所以就函数的返回类型为。二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了。此时进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。按照中左右的顺序,先进行交换左右孩子节点,然后反转左子树,反转右子树。

2024-01-18 16:20:38 1097 1

原创 Leetcoder Day12|二叉树part01

链式存储的二叉树节点的定义方式:int val;int val;

2024-01-18 14:25:35 1141 1

原创 Leetcoder Day11|栈与队列part03(队列的应用)

面试题:栈里面的元素在内存中是连续分布的么?陷阱1:栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。陷阱2:缺省情况下,默认底层容器是deque,那么deque在内存中的数据分布是什么样的呢?答案是:不连续的,下文也会提到deque。

2024-01-17 15:42:44 832

原创 Leetcoder Day10|栈与队列part02(栈的应用)

只不过在括号里我们要判断的是不匹配的情况,而这里我们要删除匹配的情况因此可以将字符串遍历,先判断再入栈,如果当前字符与栈顶元素相同,则把栈顶元素弹出,如果不等,则放入栈中。,并且,先出现的左括号对应的右括号类型往往是后出现的,这个情况非常适合栈的特点,先进后出。本题思路可以简化为,遇到一个符号则把符号前面的拿出来进行符号对应的操作再压入栈中,很像上一题相邻重复项的思路,只不过这里的重复项定义为数字。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2024-01-17 13:17:18 893

原创 Leetcoder Day9|栈与队列part01

语言:Java/C++理论基础又是考研时数据结构里接触到的老朋友,

2024-01-17 11:22:44 1053

原创 Leetcoder Day8|字符串part02

字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。在C语言中,把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。a[i]!= '\0';i++) {在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用'\0'来判断是否结束。i++) {那么vector< char > 和 string 又有什么区别呢。

2024-01-09 20:48:34 865

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除