自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 20240404-1544.把字符串变好

给定一个由小写和大写英文字母组成的字符串 s。一个好的字符串是没有两个相邻字符 s[i] 和 s[i + 1] 的字符串,其中:0

2024-04-05 11:00:26 238

原创 20240226-100. 同一棵树

如果每棵树中的节点总数为 n(假设两棵树的结构和节点数都相同,以进行最坏情况分析),则时间复杂度为 O(n),其中 n 是树中的节点数。- 在最坏的情况下,树是完全不平衡的,例如,每个节点只有一个子节点,导致递归深度为 `n`,其中 `n` 是树中的节点数。- 在最好的情况下,树是完全平衡的,树的高度为 log(n),因此调用栈导致的最好情况下的空间复杂度为 O(log(n))。因此,isSameTree 函数的时间复杂度为 O(n),其中 n 是两棵树中较大的一棵树的节点数。

2024-02-27 07:39:36 435

原创 20240223-2092.查找所有有秘密的人

但是,使用路径压缩后,时间复杂度接近于常数时间,平均复杂度为 \(O(\alpha(n))\),其中 \(\alpha(n)\) 是Ackermann函数的反函数,对于所有实际的输入值几乎可以认为是常数。但这不会超过 \(O(m)\)。在最坏情况下,每次合并操作的时间复杂度为 \(O(\alpha(n))\),因此总的时间复杂度为 \(O(m \alpha(n))\)。- 首先,按时间对会议进行排序,其时间复杂度为 \(O(m \log m)\),其中 \(m\) 是会议的数量。

2024-02-26 15:34:45 823

原创 20240221-查找城镇法官

如果存在法官那么一定意味着有一个人不信任任何人,也就是他不会出现在trust[i]中的a[i]位置上即可,其次他会在b[i]的位置上出现n-2次。给你一个数组 trust,其中 trust[i] = [ai,bi] 表示标有 ai 的人信任标有 bi 的人。如果 trust 数组中不存在信任关系,那么这种信任关系就不存在。在一个小镇上,有 n 个从 1 到 n 的人。如果小镇法官存在且可以识别,则返回小镇法官的标签,否则返回-1。2. 每个人(除了小镇法官)都信任小镇法官。1. 小镇法官不信任任何人。

2024-02-22 14:27:26 145

原创 20240219-2的幂

这是因为n是2的幂次方,意味着它的二进制表示中只有一个1,减去1之后,这个1就变成了0,而且1后面的所有0都变成了1。首先,我们知道如果一个数是2的幂次方,那么它的二进制表示中只有一个1,并且1后面跟着若干个0。对于两个二进制数,只有在相同位置上的两个位都为1时,结果的该位才为1;否则,结果的该位为0。给定一个整数 n,如果它是 2 的幂,则返回 true。如果存在一个整数 x,使得 n == 2^x,则整数 n 是 2 的幂。有一个位运算的技巧是,对于任何一个数n,如果n是2的幂次方,那么。

2024-02-20 10:50:26 144

原创 20240217-您能到达的最远建筑物

梯子是论个数的,每一个可以无视高度,而砖块则是有限个数,需要足够多的砖块才能够到达下一栋楼。如果我们跳出来看,可以都先使用梯子来完成,并且记录梯子跨过的高度,当遇到比之前更大的高度(更需要用梯子来跳过),我们则把之前用梯子跨过的高度换成砖头。最基本的想法肯定是,当楼高的差值特别大的时候我们就用梯子,如果比较小我们就尽可能用砖块,梯子留着给高楼用。是一种自动排序的队列,它保证每次取出的元素都是队列中的最大值(或最小值,取决于如何配置)。如果当前建筑的高度大于或等于下一栋建筑的高度,则不需要梯子或砖块。

2024-02-18 09:58:08 966

原创 20240216-删除 K 个唯一整数后的最少数量

用一个哈希表遍历一遍,我们就得到了arr中每个元素出现的次数,然后利用贪心的思维,从小到大把出现次数少的全部删掉,出现次数多的保留,统计留下的元素个数即可。给定一个整数数组 arr 和一个整数 k。求恰好删除 k 个元素后唯一整数的最少个数。遍历操作O(n),排序O(nlogn),总体时间复杂度O(nlogn)。map、nums分别用来存储,复杂度O(n)。

2024-02-17 04:50:45 230

原创 20240215-查找周长最大的多边形

排序之后我们的,我的的dp数组需要存储的是截止到nums中的第i个元素的最长多边形的周长(多边形的边数量需要大于等于3)。如果这个sum大于当前的nums[i],就意味着我们在满足条件1的同时也满足了条件2,即可以把nums[i]加入到多边形中,然后更新多边形的周长即可。第二这种方法要求我们需要存储以当前边为结尾的最长多边形的和,也就是意味着我们需要把当天的第i个元素视作是多边形的最长边,那么我们需要做的就是在之前所有元素中找到元素之和能够大于当前的最长边即可。多边形的周长是边长之和。

2024-02-16 04:01:29 891

原创 20240209-最大可整分子集

要求新加入的元素能够整除前一个元素,所以这里在遍历i的同时,可能还需要遍历之前所有的数来检查是否能够整除:dp[i] = max(dp[i], dp[j]+1) {if nums[i] % nums[j] == 0}再思考一下,在数组中寻找一个特定要求的子序列,那么如果我们把数组进行排列,这个题目就变成了寻找“最长上升子序列”类似的题目,因为我们要求每两个数之间具备整除关系,这就意味着其中一个一定大于等于另一个。我们需要在判断dp[i]和dp[j]的大小时,动态的存储i对应的前一位的位置j。

2024-02-10 01:56:38 359

原创 20240131-将数组划分为具有最大差异的数组

那么想到我们需要首先对数组进行排序,因为数组经过排序后相邻元素的差值最小。这意味着如果排序后的数组中存在任何相邻元素之间的差值大于k,那么将这些元素分配到满足条件的大小为3的子数组中就不可能了。反过来,如果排序后的数组中所有相邻元素的差值都不大于k,那么我们就可以三个一组的构建数组了。首先仔细看题目中的要求,每个数字在子数列中出现恰好1次,同时n一定是3的倍数。排序时间复杂度O(nlogn),遍历数组O(n),总体时间复杂度O(nlogn)。给你一个大小为 n 的整数数组 nums 和一个正整数 k。

2024-02-01 12:57:37 419

原创 20240125-边界外路径

有一个m*n的网格,网格中有一个小球。您可以将小球移动到网格中相邻的四个单元格之一(可能会越过网格边界移出网格)。状态转移关系:在maxMove步之内从(i,j)位置踢出界外的路径数量等于在maxMove-1步之内从(i,j)的相邻位置踢出界外的路径数量之和。给定 m、n、maxMove、startRow、startColumn 这五个整数,返回将小球移出网格边界的路径数。这个题目有三个状态:横坐标、纵坐标和可移动的次数,所以我们可以用一个三维的dp数组存储这三个状态或者一个带有三个参数的dp函数。

2024-01-27 03:26:44 283

原创 20240123-二叉树中的伪平行路径

在这个上下文中,"当前节点值的位"指的是一个位掩码中的一个特定位,该位代表了一个从1到9的数字。在我们的场景中,我们使用位掩码的每一位来表示数字1到9是否在当前路径上出现了奇数次。判断回文我们只需要统计一个路径上字符出现的次数,要么全部为偶数,要么只有一个数字为奇数则是回文。:对于每一位,如果两个操作数的相应位一个是1另一个是0,则结果为1。:对于每一位,如果两个操作数的相应位中至少有一个为1,则结果为1。:对于每一位,只有两个操作数的相应位都是1时,结果才为1。这个操作的效果是将位掩码中的最低位的。

2024-01-26 18:24:09 1152

原创 20240122-具有唯一字符的连接字符串的最大长度

同一个字符串中的重复元素检查,采用‘insert’方法来判断返回值是否已经存在于‘set’中,如果插入的是已经存在的字符,会返回false。子序列是一个数组,它可以在不改变其余元素顺序的情况下,通过删除某些元素或不删除任何元素从另一个数组派生出来。找到由数组中的字符串组合而成的最长唯一字符串。考虑使用‘set’追踪字符唯一性:‘set’自然的保证了其中元素的唯一性,因为不允许重复元素存在。简单来说我们需要组成尽可能长的字符串并且保证出现的字符是唯一的。采用回溯算法逐一探索所有可能的字符串组合。

2024-01-26 10:37:20 364

原创 20240121-集合不匹配

/ 又好像不需要这么麻烦,从起始位置开始遍历,我们其实是知道每个位置需要出现的数字的。不幸的是,由于某些错误,s 中的一个数字被复制到了整数集中的另一个数字上,导致一个数字重复,另一个数字丢失。那么,如果我能够通过某些方法,找到这个重复对应的索引,不就是找到了那个重复元素么?找到那个没有元素对应的索引,不就是找到了那个缺失的元素了么?现在的问题是,有一个元素重复了,同时导致一个元素缺失了,这会产生什么现象呢?中不存在重复元素和缺失元素,那么每个元素就和唯一一个索引值对应,对吧?我们现在自己改造下问题,

2024-01-23 07:19:41 330

原创 20240119-子数组最小值之和

给定一个整数数组 arr,求 min(b) 的总和,其中 b 的范围涵盖 arr 的每个(连续)子数组。特别注意:处理数值相同时的情况。(始终认为出现相同值时,右边的更小)。然后又想到不需要真正求出子数组,只需要求出子数组的最小值即可。我们只需要找出所有的组合然后加到一起。但是这样至少需要O(N^2)的时间复杂度,会超时。为最小值的子数组数量。知道这两个位置后,我们可以计算以。左侧和右侧可扩展的位置数的乘积。

2024-01-20 18:23:14 635

原创 20240118-最小下降路径总和

昨天的爬楼梯以前写过,是一道基础的动态规划,就不重新写了。今天的题目也是一道动态规划的基础题目,需要多处理一些问题即可,思路比较清晰。

2024-01-19 09:47:55 337

原创 20240116-唯一出现次数

然后感觉用两个哈希表太复杂,再去问问gpt能不能优化。唯一,则返回 true,否则返回 false。给定一个整数数组 arr,如果数组中。这题比较简单,就直接写代码了。结果好像反而还变慢了。

2024-01-17 09:59:11 374

原创 20240112-补 制作两个字符串字谜的最少步骤数

看起来非常的简单,用哈希表统计每个字符出现的次数,如果字母a在单词bbb中没出现过,那么次数即为零。统计两个字符串相同字母出现次数的差值,相加除以2就是我们所需要的答案。给你两个长度相同的字符串 s 和 t。在一个步骤中,你可以选择 t 中的任意一个字符并用另一个字符替换它。字符串的 "字谜 "是指字符串中的相同字符具有不同(或相同)的排列顺序。返回将 t 变为 s 的变位所需的最少步数。

2024-01-17 04:48:54 356

原创 20240115-插入删除 GetRandom O(1)

Info 数据结构精品课 (https://aep.h5.xeknow.com/s/1XJHEO) 和 递归算法专题课 (https://aep.xet.tech/s/3YGcq3) 限时附赠网站会员;其实是不能的,因为根据刚才说到的底层实现,元素是被哈希函数「分散」到整个数组里面的,更别说还有拉链法等等解决哈希冲突的机制,基本做不到。底层用数组实现,且数组必须是紧凑的,这样我们就可以直接生成随机数作为索引,选取随机元素。但如果用数组存储元素的话,常规的插入,删除的时间复杂度又不可能是。

2024-01-16 16:25:12 911

原创 20240114-寻找零损失或一损失的玩家

先把参与比赛的队伍的list得到,然后用哈希表统计输的次数,如果哈希表中的队伍没有出现在全部list中则是全胜的。查找无失利或正好有一场失利的球队的循环复杂度为 O(T),其中 T 是唯一球队的数量。对于 res 中的两个子向量,排序功能的复杂度均为 O(T log T)。遍历每场比赛的主循环的时间复杂度为 O(N),其中 N 为比赛场次。Map和Set共需要 O(T) 个空间,其中 T 是唯一球队的数量。结果向量需要额外的空间,但不会超过 O(T)。因此,总的空间复杂度为 O(T)。

2024-01-15 16:31:57 337

原创 20240113-确定两个字符串是否接近

给定两个字符串,word1 和 word2,如果 word1 和 word2 接近,则返回 true,否则返回 false。操作2,交换不同字母的个数,也就是说我们甚至不需要准确的记录每个对应每个字母出现的次数,只要记录出现次数的list能对应上就可以。很明显操作1中的操作并不改变字母的数量,但是可以1对1操作字母顺序。检查字符是否存在: O(N),假设映射操作为 O(log N),且最多有 N 个唯一字符。”,因此我们似乎并不需要记住字母的顺序,只需要记住字母出现的次数即可。两个字符串相似的定义是“

2024-01-14 14:49:23 911

原创 20240112-确定字符串的两半是否相似

时间复杂度O(n)。如果两个字符串的元音字母数目相同('a'、'e'、'i'、'o'、'u'、'A'、'E'、'I'、'O'、'U'),那么它们就是相同的。因此,这部分的时间复杂度与字符串的长度 `n` 线性相关,即 `O(n)`。2. **计数器**: 使用了两个整型变量 `count1` 和 `count2` 来计数,这也是常数空间占用。1. **元音集合**: 这个集合包含了10个元音字母,是一个常数空间占用,即 `O(1)`。综上,这段代码的时间复杂度是 `O(n)`,空间复杂度是 `O(1)`。

2024-01-13 15:48:44 373

原创 20240109-补 二叉树被感染的时间

这将标志着我们已经找到了起始节点,当我们遍历树时,只要遇到负深度,我们就知道子树包含起始节点。此外,在遍历树的过程中,我们可能会在计算出树的每个部分的最大深度之前就找到起始节点。因此,我们需要保存最大距离,并在遍历树的其他部分时继续计算它。如果具有初始值的节点刚好是根节点,那么题目就变成了与根节点的最大距离,也就是树的最大深度。那么问题就转变成了,能否有一种方法,即使起始节点不是根节点,也能利用子树深度计算出起始节点的最大距离?树内的节点都是不重复的。因此我们只需要找到起始节点到根节点的最远距离就是结果。

2024-01-12 17:34:07 850

原创 20240110-节点和祖先之间的最大差异

一道二叉树的操作题,要求返回所有可能的祖先和子孙的差的最大值。对于每个子树,找到其后代的最小值和最大值。因为需要左右子树的返回值都拿到才能处理中间节点,所以采用后序遍历。给定一棵二叉树的根,求存在不同节点 a 和 b 的最大值 v,其中 v = |a.val - b.val|,且 a 是 b 的祖先。节点 a 是 b 的祖先,如果: a 的任何子节点等于 b 或 a 的任何子节点是 b 的祖先。

2024-01-11 12:14:33 345

原创 20240106-算术切片 II - 子序列

给定一个整数数组 nums,返回 nums 的所有算术子序列的个数。如果一个数字序列至少由三个元素组成,且任意两个连续元素之间的差值相同,则该序列称为算术序列。例如,[1, 3, 5, 7, 9]、[7, 7, 7]和[3, -1, -5, -9]都是算术序列。

2024-01-07 12:32:50 863

原创 20240105-工作安排的最大收益

这个题目看起来似乎是一个递归问题(背包),在有限的时间内放下最多的工作(产生最大的价值?我们有 n 份工作,每份工作都安排在 startTime[i] 至 endTime[i] 期间完成,从而获得 profit[i] 的利润。目前已经完成了回溯:深搜(其实好像不太能抽象成一棵树)算法,但是目前还没有正确的处理时间冲突(即i+1的部分),修改后代码如下,如果你选择了一项在 X 时间结束的工作,你就可以开始另一项在 X 时间开始的工作。这次的深度优先搜索需要遍历所有的可能情况,然后返回最优的profit值。

2024-01-07 10:48:08 813

原创 20240104-最长上升子序列

11月底学完之后目前又有点忘了,这一个月经历了各种被拒绝,也去外边玩儿了一圈。要继续努力提高自己代码算法、概率论、写策略的能力。给定一个整数数组nums,返回最长严格递增子序列的长度。

2024-01-05 09:38:09 308

原创 240103-把数组变空的最少操作次数

直觉上让我想到用哈希表来解决,把元素对应的值变成字符出现的次数。然后2和3的最小公倍数是6,也就是说只有1,7,13...这个数列无法被2和3组合出来,除此之外的所有正整数都可以被2和3组合出来。综上,逻辑判断结束,只需要累加每次的最优解个数即可。然后发现并不是这样的,因为7也可以用2*2+3...,那么如果不用6,用3来讨论又会怎样?,如果出现余数是1则返回-1。如果可以变空,则需要返回最少操作次数,返回使数组为空所需要的最少操作次数,如果不可能则返回-1。我的第一反应是,查找。

2024-01-04 14:37:04 464

原创 Leetcode 1727. 具有重排的最大子矩阵

题目要求:给定一个大小为 m x n 的二进制矩阵,并且允许您以任意顺序重新排列矩阵的列。对列进行最佳重新排序后,返回矩阵中每个元素都为 1 的最大子矩阵的面积。输入:矩阵 = [[0,0,1],[1,1,1],[1,0,1]]输出:4说明:您可以重新排列列,如上所示。最大的 1 子矩阵(粗体)的面积为 4。

2023-11-26 18:42:01 544

原创 算法训练营一刷 总结篇

最后,这60天也是我找工作的窗口期,在这个阶段我经历了很多的挫折,投简历没有回音、面试笔试被拒等等,生活经常是苦涩的,因为这种情况我本人的状态也不太好,比较懒惰。也是一件令我开心和骄傲的事情,我希望自己能够坚持这种状态,继续努力的走下去!这两个月中,学习、练习了许许多多的算法,坚持每天完成博客来打卡,养成了写C++的习惯,现在相比于Python我反而更喜欢思路严谨的C++。这60天的坚持确实让我获益匪浅。目前我也能够在lc周赛中做出一些题目了,之后我还会继续坚持刷题,可以先从lc每天的题目开始。

2023-11-22 04:09:39 494

原创 DAY60 84.柱状图中最大的矩形

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。那么因为本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!中我讲解了接雨水的单调栈从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。

2023-11-22 04:00:39 461

原创 DAY59 503.下一个更大元素II + 42. 接雨水

题目要求:给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:可以选择扩充nums数组,或者其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。42. 接雨水题目要求:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 2:本题暴力解

2023-11-20 10:08:06 195

原创 DAY57 739. 每日温度 + 496.下一个更大元素 I

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

2023-11-18 07:14:34 116

原创 DAY56 647. 回文子串 + 516. 最长回文子序列

所以转变思路,重新写dp数组。其他情况dp[i][j]初始为0就行,这样递推公式:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);中dp[i][j]才不会被初始值覆盖。如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

2023-11-17 10:37:25 78

原创 DAY55 583. 两个字符串的删除操作 + 72. 编辑距离

题目要求:给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

2023-11-16 16:06:43 89

原创 DAY54 392.判断子序列 + 115.不同的子序列

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。这里大家已经可以发现,在定义dp[i][j]含义的时候为什么要。

2023-11-15 05:21:05 310

原创 DAY53 1143.最长公共子序列 + 1035.不相交的线 + 53. 最大子序和

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]。即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);这里不要求子序列是连续的。

2023-11-14 15:26:38 202

原创 DAY52 300.最长递增子序列 + 674. 最长连续递增序列 + 718. 最长重复子数组

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l

2023-11-13 08:00:16 168

原创 DAY50 309.最佳买卖股票时机含冷冻期 + 714.买卖股票的最佳时机含手续费

如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);设计一个算法计算出最大利润。

2023-11-11 06:56:05 199

原创 DAY49 123.买卖股票的最佳时机III + 188.买卖股票的最佳时机IV

dp[i][1]可以由max(dp[i-1][1], dp[i-1][0] + prices[i])导出,那么dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][0][0] + prices[i]);选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);此时还没有买入,怎么就卖出呢?

2023-11-10 14:26:06 40

空空如也

空空如也

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

TA关注的人

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