- 博客(57)
- 收藏
- 关注
原创 【PointNet—论文笔记分享】
这意味着点不是孤立的,并且相邻点形成一个有意义的子集。因此,模型需要能够从附近的点捕捉局部结构,以及局部结构之间的组合相互作用。作为一个几何对象,点集的学习表示应该对某些变换是不变的。例如,旋转和平移点都不应该修改全局点云类别,也不应该修改点的分割。无序(Unordered):换句话说,一个处理N个3D点集的网络需要对N!两个对齐输入点和点特征的联合对齐网络(joint alignment networks)第一个直接基于原始点云数据进行分割、分类的模型,之前都是基于多视图或者体素的方式。
2023-10-24 20:15:43 739
原创 vscode 无法导入自己写的模块文件(.py)问题
PYTHONPATH是一个环境变量,用于指定Python解释器在导入模块时搜索模块的路径。当我们导入一个模块时,Python解释器首先会在系统默认的路径中搜索模块,然后再到PYTHONPATH中搜索。如果模块在这些路径中找不到,Python解释器将会抛出“ModuleNotFoundError”。是使用vscode运行调试程序的启动设置,包括设置环境变量,使用哪个解释器,debug类型以及程序入口等等。是vscode程序的设置选项,包括快捷键,插件设置等。,还是使用右上角快捷方式,都可以正常运行。
2023-08-01 10:13:49 5620 2
原创 Python类中的self参数的理解
对于self参数来说,和一般初学者一样,只把它作为类里面函数参数的第一个必须要写的内容,感觉和C++ 类里面的this 指针类似,具体没有深究。注意:要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入。self 并不是python中的关键字,是约定俗成的,可以换成其他的表示a,b, 但为了统一,都是使用 self。self 在 定义类 的方法时, 是必须的,但调用时不用手动传入self,会自动传入。
2023-07-30 15:22:21 580
原创 代码随想录一刷总结
一是对算法的基础知识有了一定了解,按照卡哥给出的题目顺序以及解题思路模板,一点点来,循序渐进,刷题会变得没有那么难,基本上大部分难题都可以通过卡哥文字版讲解攻克,只有少部分需要结合视频加深理解,里面很多自己在思考过程中遇到的一些坑,卡哥基本上都会讲到(非常细)。二是养成了写博客的习惯,写一些自己的心得收获,会让自己更有成就感,形成正向反馈,让自己的进步可视化(哪怕只是一点点),通过写博客,可以将自己的思考和理解过程记录下来,不仅可以帮助加深对知识点的理解,还可以与他人分享学习经验,相互学习、相互进步。
2023-07-25 09:57:18 281
原创 LeetCode | C++ 单调栈——84.柱状图中最大的矩形
以每一个柱子为基准,都去找左边比它矮的 右边比它矮的,这样就确定了它的宽,再用这个柱子的高去 乘以 它的 宽,就能算出来 在这个柱状图中,它所能形成的 矩形面积,最后选一个最大的。首 加上 0:以 柱形元素为[8, 6, 4, 2]为例,6 比 8 小,需要弹栈,此时只有 mid 和 right,缺少 left。尾 加上 0:以 柱形元素为[2, 4, 6, 8]为例,将会把所有元素全部入栈,没有计算过程,因此 尾巴加上 0, 进行计算。定义两个数组 存储每个柱子的 左右比它矮的下标,在遍历的时候,
2023-07-22 11:13:30 257
原创 LeetCode | C++ 单调栈——503.下一个更大元素II、42. 接雨水
这样就找到了一个凹槽,找到左右两边更大元素 的 最小值,减去 height[i],即为 h, 左右两边更大元素 下标 相减 再 减 1, 即为 宽, 长 × 宽 即为体积。顺序,当遇到 遍历元素 大于 栈顶元素时,即找到了 栈顶元素 的右边更大的元素,而对于栈顶元素 栈里面的下一个元素(即第二个元素),即为栈顶元素的 左边更大的元素。把每一个位置的左边最高高度和右边最高高度记录在一个数组上, 对于当前位置来说,左边最高 高度 是前一个的左边最高高度和本高度的最大值.属于横向求解,按照行方向。
2023-07-21 19:16:56 82
原创 LeetCode | C++ 单调栈——单调栈理论、739. 每日温度、496.下一个更大元素 I
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素(不然就不知道之前都遍历过哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的),优点是整个数组只需要遍历一次。为什么栈里面的元素是保证单调递增的,因为只有这样,当遍历元素大于栈顶元素时,才能计算栈顶元素在数组里它右面第一个比栈顶元素大的,其实就是我们正在遍历的这个元素。当遍历元素 大于 栈顶元素时: 需要对栈顶元素( 下标 )的 result 结果进行赋值,然后将栈顶元素弹栈,继续比较,直到不大于为止。
2023-07-21 15:13:01 91
原创 LeetCode | C++ 动态规划——647. 回文子串、516.最长回文子序列
表示区间范围[i, j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i] [j]为true,否则为false。
2023-07-20 19:19:53 140
原创 LeetCode | C++ 动态规划——583. 两个字符串的删除操作、72. 编辑距离
最后取三者之中最小的, dp[i] [j] = min(dp[i - 1] [j] + 1, min(dp[i - 1] [j - 1] + 1, dp[i] [j - 1] + 1))最后取三者最小值:dp[i] [j] = min(dp[i - 1] [j] + 1, dp[i] [j - 1] + 1, dp[i - 1] [j - 1] + 2)三:同时删除 word1[i - 1] 和 word2[j - 1], 最少操作次数为 dp[i - 1] [j - 1] + 2。
2023-07-19 17:12:00 1094
原创 LeetCode | C++ 动态规划——392.判断子序列、115.不同的子序列
表示以下标 i - 1为结尾的字符串s,和以下标j - 1为结尾的字符串 t,相同子序列的长度为dp[i] [j]。(i - 1, j -1 为结尾,方便初始化)
2023-07-17 09:45:16 225
原创 LeetCode | C++ 动态规划——1143.最长公共子序列、1035.不相交的线、53. 最大子序和
长度为[0, i - 1]的字符串 text1 与长度为[0, j - 1]的字符串 text2 的最长公共子序列为 dp[i] [j]
2023-07-16 18:12:45 376
原创 LeetCode | C++ 动态规划——300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
dp[i] 表示 i 之前包括 i 的以 nums[i]结尾 的最长递增子序列的长度需要包含nums[i]结尾,不然在做递增比较的时候,就没有意义了。
2023-07-16 12:35:55 288
原创 LeetCode | C++ 动态规划——309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
状态2:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期,或是前一天就卖出股票状态,一直没操作) 也就是冷冻期之后,这些都是保持卖出股票的状态。 前一天是保持卖出股票的状态(状态2),dp[i - 1] [1] - prices[i](1) 前一天就是持有股票状态,dp[i] [0] = dp[i - 1] [0] 前一天是冷冻期(状态4),即dp[i - 1] [3] - prices[i]dp[i] [j],第i天状态为j,所剩的最多现金为dp[i] [j]。昨天卖出了股票(状态3)
2023-07-15 17:29:39 199
原创 LeetCode | C++ 动态规划——121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
dp[i] [0] 表示第i天持有股票所得最多现金dp[i] [1] 表示第i天不持有股票所得最多现金。
2023-07-11 19:30:32 410
原创 LeetCode | C++ 动态规划——198.打家劫舍、213.打家劫舍II、337.打家劫舍III
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);如果不偷第i房间,那么dp[i] = dp[i - 1],即考 虑i-1房,(在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回。
2023-07-11 15:44:24 421
原创 LeetCode | C++ 动态规划——139.单词拆分、多重背包
dp[0] = true ,dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了, 根据题意,字符串s 非空, dp[0] = true, 完全是为了推导公式。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi。如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。
2023-07-10 17:52:49 376 1
原创 LeetCode | C++ 动态规划——70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数
凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。和为 j 的完全平方数的最少数量为dp[j]
2023-07-10 12:50:04 226
原创 LeetCode | C++ 动态规划——完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ
即可以先物品再背包,或者先背包再物品,因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。即无论 按 行,或者按列,填充 dp[j], 都是从 小 到大, 而 dp[j] 是根据先前的dp[j]计算出来的,所以没影响。每一个背包容量都是 1,2 的情况下进行遍历,每一个容量下都 放了 1 2,所以说,这里面 既有 {1, 2} 也有 {2, 1}下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]凑成目标正整数为j的排列个数为dp[j]
2023-07-09 19:08:13 132
原创 LeetCode | C++ 动态规划——1049. 最后一块石头的重量 II、494. 目标和、474.一和零
1049题目链接本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。这样,整体来说和416.分割等和子集 差不多public :sum += i;
2023-07-08 21:44:57 161
原创 LeetCode | C++ 动态规划——01 背包理论代码,应用:416.分割等和子集
dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。
2023-07-07 19:31:03 290
原创 LeetCode | C++ 动态规划——343. 整数拆分、96.不同的二叉搜索树
1到i为节点组成的二叉搜索树的个数为dp[i]。j相当于是头结点的元素,从1遍历到i为止。所以。
2023-07-04 07:49:08 70
原创 LeetCode | C++ 动态规划——理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。动态规划中每一个状态一定是由上一个状态推导出来的动态规划五步曲以上是分析的思路,到具体写代码的时候,肯定是先初始化dp数组,在写递推公式。动态规划应该如何debug找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。动态规划的一般问题(1)动规基础(2)背包问题(3)打家劫舍
2023-07-02 10:19:20 48
原创 LeetCode | C++ 贪心算法——738.单调递增的数字、968.监控二叉树
但是会有1000 这种情况,按照上面方法会变成900,显然不是最大的,所以调整上述方法,记录变为9的最大i 位置,然后将其后面的值全部变成9.在回溯遍历到空节点的时候,空节点的状态只能赋值为 有覆盖,其他两种状态 均无法使得 叶子节点的父节点放摄像头。1、当左右孩子都为 有覆盖2 时,父节点为无覆盖0,等着父节点的父节点安装摄影头将其覆盖。叶子节点的父节点优先放摄像头,然后向上遍历的过程中,然后每隔两个节点放一个摄像头,无摄像头的状态其实就分为 0、2,要么有覆盖,要么无覆盖。
2023-07-01 19:13:31 84
原创 LeetCode | C++ 贪心算法——435. 无重叠区间、763.划分字母区间、56. 合并区间
本题与452用最少数量的箭引爆气球非常相似,按照左边界进行排序,计算非重叠区间的个数,对于重叠区间来说,需要计算重叠边界的最小右边界;如果两者重叠,也就是把第i个重叠区间的右边界转化为两者的最小右边界即可。题意:同一个字母最多出现在一个片段中,为了把同一个字母放到一个片段,在其中涉及的其他字母也要放到该片段,即找到所涉及字母的最远边界。首先按照左边界从大到小进行排序,如果相邻两个区间有重叠,则更新右边界为两者之中最大的,如果没有重叠,则直接放入结果中。首先利用数组哈希表对字母出现的最远下标进行存储。
2023-07-01 11:40:03 53
原创 LeetCode | C++ 贪心算法——860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。
2023-06-27 18:56:43 97
原创 LeetCode | C++ 贪心算法——1005.K次取反后最大化的数组和 、134. 加油站、135. 分发糖果
然后再从右向左遍历,确定左边比右边大的情况,只要左边比右边的大,左边就比右边多一个糖果,此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。首先从左向右遍历,先确定右边评分大于左边的情况,只要右边比左边的大,右边就比左边多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。:主要是模拟跑一圈的过程,可以使用。
2023-06-26 15:34:06 102
原创 LeetCode | C++ 贪心算法——122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
局部最优:收集每天的正利润,全局最优:求得最大利润55. 跳跃游戏贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。45.跳跃游戏II在每一步可以达到的范围内寻找下一步可达到的最大覆盖范围,以此求得最小步数,一旦覆盖范围覆盖到终点,即输出步数
2023-06-24 10:54:02 117
原创 LeetCode | C++ 贪心算法——理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
默认第一个值前面有一个相同的值,产生平坡, prediff = 0, 将数组首考虑进来,result 默认为1, 将 数组尾考虑进来。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。遍历的时候,一定是先遍历孩子,再遍历饼干,因为如果饼干不能满足条件的话,是不能一直 减减的。思路:用小饼干尽量先去满足胃口小的孩子,或者用大饼干尽量先去满足胃口大的孩子。对孩子的胃口,和饼干进行排序。全局最优:选取最大“连续和”
2023-06-23 11:31:57 69
原创 LeetCode | C++ 491.递增子序列、46.全排列、47.全排列 II
因为本题说 数值范围在[-100, 100]之间,所以可以用数组来做哈希,更省时,定义[201]的数组,对每个值 都 + 100, 将范围变到 [0, 201]
2023-06-21 13:48:50 40
原创 LeetCode | C++ 93.复原IP地址、78.子集、90.子集II
本题也是切割问题,只不过终止条件不能像131 分割回文串一样用切割线,因为题目明确 只能切成4段, 所以将分割的段数作为终止条件,在这里引入一个 pointNum 来记录 分割符 . 的数量, 当数量为 3 且 最后一段也合理时,即跳出循环。单层搜索逻辑,假如分割的字段合理,就在其后面 加上 . 分割符,注意回溯的时候也需要将其删掉。该题目唯一需要注意的就是:收集子集 要写在终止条件的上面,否则就把子集给漏掉了。本题是 40.组合总和II 和 78.子集这两道题目的结合。
2023-06-20 11:16:17 57
原创 LeetCode | C++ 39. 组合总和、40.组合总和II、131.分割回文串
在这里引入了一个used bool 类型数组,对于使用过的元素标记为true, 未使用过的标记为 false. 该数组的目的去确定这个是在树层上还是在树枝上, 假如相同元素的 i - 1 位置 为false, i的 位置为 true, 则判断为树层, 若i - 1 和 i 的位置上 都为true,则判断为树枝。需要对给出的集合进行排序,目的是让相同的元素相邻,注:相同的元素中第一个遍历的时候,会包括后面相同元素遍历的所有情况,所以,需要在树层层面进行去重,即对后面相同的元素进行 跳过。
2023-06-19 14:44:33 43
原创 Jupyter Notebook强推的五大配置技巧
Jupyter Notebook强推的五大配置技巧:1. 更改默认工作目录;2.更改默认浏览器;3. 设置登录密码;4.安装扩展插件;5. 修改notebook样式
2023-06-18 21:24:24 778
原创 LeetCode | C++ 216.组合总和III、17.电话号码的字母组合
和77 组合整体类似,只不过加了一个总和 为 sum 的限制条件,同时对应剪枝也可以通过 判断 path的总和 大于 sum 时 也退出。相较于77、216题,本题是求不同集合之间的组合。对于不同的集合 是通过 index 来控制的。
2023-06-18 10:40:17 131
原创 LeetCode | C++ 回溯算法总结(参考代码随想录)77. 组合
回溯搜索法是递归的副产品,只要有递归就会有回溯,通常递归函数的下面就是回溯的逻辑。本质是穷举,并不高效。那为啥还要使用这种方法呢,因为针对一些问题能够通过暴力搜索出来,撑死优化就是再剪枝下,就已经很好了,找不到更优的解决办法。
2023-06-16 22:11:39 91
原创 LeetCode | C++ 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
对于本题而言,选取中间结点的时候一定要选取中间位置的结点,只有这样,才能保证它的左区间的结点数量和右区间的结点数量是相同的,这样构造出来的二叉树才能保证它是平衡的。对于该题,对结点中的判断逻辑,如果为NULL,就返回NULL, 如果 < low, 则再次去遍历 该节点的右子树,因为右子树中可能会有符合条件的值, 对处理过的右子树进行返回, 同样的,如果 > high, 则再次去遍历 该结点的左子树,因为左子树可能会有符合条件的值, 对处理 过的左子树进行返回。其他语言就没有这个问题,自带内存回收机制。
2023-06-16 17:19:37 88
原创 LeetCode | C++ 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
最后一种情况是最复杂的,可以采取以下两种方式进行求解:将左子树接到右子树最左边的结点的左边;或者 将右子树街道左子树最右边的结点的右边,这样就转化为 3、4 两种情况。如果找到对应的叶子结点,插入时 是需要父节点的。对于二叉搜索树来说,要插入一个与树中结点都不相同的结点,在叶子结点都可以找到它的位置。(2)要删除的结点位叶子结点,左右孩子均为空。(3)要删除的结点左孩子为空,右孩子不为空。(4)要删除的结点右孩子为空,左孩子不为空。(1)二叉搜索树中没有要删除的结点。(5)要删除的结点左右孩子均不为空。
2023-06-15 15:22:29 63
原创 LeetCode | C++ 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
判断左子树有没有 出现p , 出现就往上返回, 右子树有没有出现q, 出现就往上返回, 最后判断中,若左右都不为空,即为 最近公共祖先。当p q 其中一个 本身就为 最近公共祖先时,这种情况以及被包含着 上面了, 当遇到 最近公共祖先时,就返回了,就不忘下遍历了。第一,如果不是搜索树,只是普通的二叉树, 就直接进行遍历,用map对频率进行统计,并进行排序。所以该题 只能用 后序遍历 左 右 中, 回溯的 过程 就是中, 中 才是我们的处理逻辑。第二步: 找到与最大次数相同的次数的值。
2023-06-14 20:34:30 146
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人