- 博客(84)
- 收藏
- 关注
原创 第1周|每日一题|12.8-12.14
当遍历到 corridor[i] 时,如果它是座位,并且包括它我们遍历到奇数个座位,那么 corridor[i] 就是一个新的座位组的开始,它和上一个组之间就有 i−prev−1 个装饰植物,即 i−prev 种放置屏风的方法。三元组问题一般通过枚举或遍历中间的元素(本题的j)来实现,因为能够同时分割i和k,不用再判断i和k的位置关系。为此,我们用一个i把当前的排序后的数组分成两个部分,i以前的部分是较小值,i以后是较大值。显然,较小的值增加,较大的值减小,能够得到较小的差值。
2025-12-14 01:04:31
338
原创 每日一题|3235.判断矩形的两个角落是否可达|几何关系、深度优先搜索
如果不是,标记圆为以访问,然后遍历全部没有访问过的圆,如果每一个圆和其构成的相交区有一个点严格在矩形内 并且 其往下搜索的结果返回了True,那么我们返回True。3、有一个由 其余圆 组成的“组合图形”链接这两个圆 并且 在这个“组合图形”中每两个相交的圆必须存在相交的部分是“严格”在矩形内。那么不可达的意思就是:在极端边界的两种情况上,各有一个点,并且这两个点之间存在一条“拦截线”(紫色)。2、和左侧 或 上侧 边界有交点,并且可以dfs一路到右侧 或者 下侧边界。1、点在圆内(圆内 也包含 圆上)
2025-12-09 14:48:21
231
原创 每日一题|3251. 单调数组对的数目 II|组合数
可以看到,只是对于nums[i] > nums[i - 1]的时候才需要进行更新,也就是纵坐标+d,步骤数变成C(m + n - nums[i] - nums[i - 1], n),其中m是数组中最后一个数字,n为元素个数。那么我们假设在一个位置i处,之前的i - 1都是满足上面性质的数列,但是nums[i]!x, y分别来自arr1和arr2,如果x是递增的,那么由于y = num - x则y一定是递减的。只能往上和右边走,能够到达右上角(4, 5)的步骤数量:C(5 + 4, 4)=126。
2024-11-28 20:44:22
283
原创 每日一题|540.有序数组中的单一元素|二分查找、异或操作
无视“有序”这个条件,同之前对于无序数组中存在的唯一元素一样。直接对全部数字和0取异或操作。好处是代码比较简洁。坏处是因为没有用到“有序”的条件,所以代码的时间是O(n)。
2024-11-10 23:20:36
302
原创 每日一题|3255. 长度为 K 的子数组的能量值 II|递增序列、计数器
同昨天的解法一样,遍历一遍的同时,统计当前最长的子串长度,如果>=k,则将子串开始位置处赋值子串当前位置元素的值。需要注意的是计数器的初始化,应该是0而不是1,因为还没有开始统计。0位置的计数器会在else被赋值为1。
2024-11-07 01:51:10
271
原创 Hot 100|哈希|1.两数之和、49. 字母异位词分组、128. 最长连续序列
之前写过这道题目,用字典记录当前的数字和索引。如果遇到target - num在字典中,则返回。本题的关键在于构建key,由于set是可变对象,不能哈希,所以考虑使用排序后的字符串(不可变对象)作为key,value为对应的原始单词。最后返回value组成的数组。这里需要注意dic = collections.defaultdict(list)这个写法,表示在创建一个新的key的时候,value自动初始化为[ ]。
2024-11-06 16:13:25
294
原创 633. 平方数之和|暴力枚举、双指针
让a从0遍历到int(c+ 1),同时计算每一个a时刻下的b,判断其是否是整数。Time: O(c) Space: O(1) 原地操作。
2024-11-04 14:08:02
266
原创 每日一题|1497. 检查数组对是否可以被 k 整除|两数之和的模运算
所以用any对整个数组进行检查,如果有不满足的之间返回False。那么,如果该数组满足要求,对k取模为m1的数字个数必然。取模,等于每个数字分别对k取模的和。最后再检查取模为0的个数是否是偶数,对k取模为m2的数字个数。
2024-10-22 16:05:33
323
原创 每日一题|910.最小差值II|数组排序思路、单调性
前一个部分增加k,后一个部分减小k。我们思考更新后的数组的最大、最小值来自哪里。把当前的排序后的数组分成两个部分,i以前的部分是较小值,显然,较小的值增加,较大的值减小,能够得到较小的差值。因为i以后的值都减小k,不可能比原最大值-k还要大。所以,只需要遍历一次nums,就可以得到最小的差值。新的最大值只能来自原数组的。
2024-10-21 23:50:01
259
原创 每日一题|3158. 求出出现两次数字的 XOR 值|哈希
这里采用set来维护访问过的数字,利用哈希来提升时间效率。题目给的范围很小,50以内,所以什么数据结构都可以。
2024-10-12 18:31:16
232
原创 每日一题|3162. 优质数对的总数 I、II|因子分解、计数方法
字典是比较好的选择,因为因数的大小不固定且不一定连续,list的索引范围受到限制,其次,我们需要在遍历全部的因数的时候多次修改该因数出现的次数,高频访问的数据,用hash的字典能够有效节省时间。第二题的难度提升在数量级在10万左右,暴力的话时间复杂度O(m*n)必然超时,那么不能使用模拟双层for循环,就需要分析数学上的原理。对于一个数而言,如果可以被两个数的乘积整除,也就说明这个数的所有因子必然包含另外两个数。(3)遍历全部的nums2,只要是字典中的key值,就把其value计入结果。
2024-10-10 19:16:59
401
原创 每日一题|3171. 找到按位或最接近 K 的子数组|位运算、集合
所以在内层遍历的时候需要时刻检查当前nums[j]是否已经包含了nums[i],也就是还是否需要继续往前遍历。如果是,则在此终止即可。外层遍历全部的nums,内层由当前位置向前遍历,储存所有的连续元素的OR结果,并不断更新和k之间的差值。OR运算:a OR b实际上是取ab的并集,也就是说,如果a OR b = a则说明b是a的一个子集。但是时间复杂度较高,并且没有考虑到位运算的特性。
2024-10-09 13:55:35
323
原创 每日一题|1436. 旅行终点站|哈希、集合
由于path[0]表示出发点,path[1]表示到达点,所以利用集合,,得到的就是“只出不进”的那一个终点(题目保证了终点的唯一性)。分析:找到唯一的一个只有到达,没有走出的元素。先收集全部的到达点,然后弹出全部的出发点。
2024-10-08 16:35:03
274
原创 每日一题|134. 加油站|循环数组单次遍历
假设1-2这一段是<0的,那么意味着从0出发不能走到0,所以我们更新初始位置和cur=0,然后从2-i这一段依然是<0的,说明2出发无法走回2,所以更新位置为i,cur = 0。这时遍历到数组末尾的时候发现累积和>0,说明i可以作为初始位置,有可能走完全程。本题题目比较绕,理解了之后发现就是给一个一维数组表示余量,找出能够首尾相连且后构成每个位置处的累积和都是正数的索引。如果全程累计和 < 0,直接-1;然后开始遍历,从0开始,到len-1截止,为什么只要遍历一个数组长度就够了?
2024-10-06 01:14:48
296
原创 每日一题|2187. 完成旅途的最少时间|二分法、计数器
这里辅助函数checked在每一个t时刻,遍历所有的车辆行驶所需时间time, 统计总共能行驶的trips数量,并返回和totalTrips的比较结果。但是如果从1开始,结束在最不理想的情况是max(time) * totalTrip,在数据很大的时候很容易time out。随着t的增加,当前能够行驶的trip数量一定不减,所以是一个在有序数列中寻找最小的t的过程。本题的一个思路是从小到大遍历全部可能的t,并分别计算当前每一辆车所能够行驶的最多trips数量。所以不妨对每一个可能的t重新思考性质。
2024-10-05 15:19:22
342
原创 每日一题|1928. 规定时间内到达终点的最小花费|动态规划、最小路径
在时刻t,位置i处,此时的花费可以表示为如下的形式:注意到道路是双向的,也就是i和j可以互换位置,所以在后面遍历的时候需要更新两个值。
2024-10-03 17:44:38
244
原创 每日一题|983. 最低票价|动态规划、记忆化递归
本题求解最小值,思路是动态规划,但是遇到的问题是:动态规划更新的顺序和步长,以及可能存在的递归溢出问题。
2024-10-01 11:24:41
373
原创 每日一题|1845. 座位预约管理系统|最小堆操作、优先队列
综上使用优先队列是比较好的选择,对于python,优先队列可以使用一个最小堆来维护,所以是heapq包内的操作,代码量很小。3、高频操作100,000次使用。1、 从一个队列中弹出最小值;2、在一个队列中加入一个值;
2024-09-30 13:29:35
234
原创 每日一题|2073. 买票需要的时间|循环数组、下标分类
那么,对于k之前的人,他们会在k买完票之前和k一样排到队首的机会,所以最多能够买ticket[k]的票,自身需要买ticket[i],所以在二者之间取最小值。同时,k买的恰好是ticket[k]张票,所以两个可以合并成一个情况。所以,一个更直接的想法是,在第k个人买完时,每个人分别都花了多少时间?从头到尾遍历全部的ticket,将每人的时间累积,得到最终结果。本题的数据范围比较大,如果是直接模拟的话会超时。,所以最多能买ticket[k] - 1张票。也就是,求出买票循环结束前每个人所花的时间。
2024-09-29 16:24:13
253
原创 力扣高频 SQL 50 题(基础版)|分析、题解
1、group by出现在having前面,但是having中所使用的聚合必须是select中的2、date类型之间的比较:datediff()= 差的绝对值 or 用字符框起来比较边界3、算日期长度需要相减之后加一4、round(, n)n默认是0,到最近的整数5、 几个算percentage的题目都要好好看。
2024-09-28 23:10:37
787
原创 每日一题|2516. 每种字符至少取 K 个|双指针、最长子串、字典
本题需要转化求解目标。对于一个序列,两头收集的最少数量的时候,剩下的部分(我们称之为子串)就会对应的越长。也就是说,我们只要求解一个满足要求的最长子串,使得两边剩余的字符数量刚好满足要求。由于题目需要分别记录固定字符的个数,采用字典进行计算。
2024-09-27 20:19:55
341
原创 每日一题|2535. 数组元素和与数字和的绝对差|数位运算
先加后减就是对于每一个数字之间完成该数字的值-数位和,然后再去下一个数字。特别的,对于小于10的数字,减自身就是0,没必要计算,可以跳过。先加后减,可以剪枝。
2024-09-26 20:15:05
260
原创 每日一题|2306. 公司命名|哈希映射、集合运算
本题可以预想暴力解法是遍历整个数组,分别进行匹配,这样的复杂度是O(n^2),必然超时。所以想到如何进行时间上的简化。对于遍历进行求解,时间主要消耗在“模拟这个过程上”,也就是真的去匹配,而没有关注到题目让求解到仅仅是“数量”。也就是说,如果能够直接从数量上进行运算,将会很方便,也很高效。对于一个数组内的两个元素,strA和strB,交换它们的首字母后,对应的分别是pre_A + suf_B 和 pre_B + suf_A。
2024-09-25 21:20:46
229
原创 代码随想录27期|Python|Day54|单调栈|42. 接雨水|84. 柱状图中最大的矩形
根据常识可以归纳出,对于每一列所能够存住的水的高度也就是,当前列的存水高度 = 左侧和右侧柱子的最大高度的较小值,减去当前列的柱子高度,所得到的差值。可以验证第4列:Height = min(2, 3) - 1 = 1,其中2是最左边的最高的柱子(3列)高度,3是右边最高的柱子的高度(7列),1是当前4列的柱子的高度。
2024-09-13 14:12:43
1239
原创 代码随想录27期|Python|Day53|单调栈|739. 每日温度|496. 下一个更大元素 I|496. 下一个更大元素 I
本章开始单调栈的内容。本题翻译过来就是:找每一个元素从这个下标开始,第一个比他大的元素的下标,返回二者之间的距离。,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。由于我们要求的是右侧第一个递增的元素,所以要维护一个从底部到顶部为递增到栈。同时为了记录距离,需要同时伴随一个记录答案的数组。1、比较栈顶下标所指向的元素和遍历到的元素大小,如果比遍历到的元素大,则将遍历到的元素放入栈中;2、如果栈顶元素和遍历到的元素相等,则也将元素放入栈中;
2024-09-13 11:58:14
405
原创 每日一题|2555. 两个线段获得的最多奖品|动态规划、二分法
dp[i]定义为在物品[i]处,有一条长度为k的、右端点不超过i所在位置的线段所能够覆盖的最大奖品数,注意这里不一定要让线段的右端点是i的位置。
2024-09-12 00:02:03
361
原创 代码随想录27期|Python|Day52|动态规划|647. 回文子串|516. 最长回文子序列
由图片可知,不同于之前的dp数组直接定义为当前遍历到的位置处题目所要求得值,而是应该定义为i为开始,j为结束的子串是否是回文串。这是因为之前的遍历过程一般都是单向的,而回文串需要两遍同时进行扩展判断,所以不能够只保留遍历到“某一处”位置的回文串个数。所以,dp的定义发生了改变,定义一个子序列是否是回文串。dp[i][j]定义为在i,j区间内的最长回文子串的长度,注意,这里是“包含”回文子串,和上一题的要求“必须以i和j为边界”不同。
2024-09-11 22:38:54
1142
原创 代码随想录27期|Python|Day51|动态规划|115.不同的子序列|583. 两个字符串的删除操作|72. 编辑距离
dp[i][j]表示以i-1和j-1为末尾的字符串中,给定字符串s包含目标字符串t的个数。注意这里不是长度。dp[i][j]表示i-1和j-1位值处的word1和word2,能够匹配到最长字符串所需要删除的字符个数;
2024-09-10 16:41:48
1149
原创 代码随想录27期|Python|Day50|动态规划|1143. 最长公共子序列|1035. 不相交的线|53. 最大子数组和|392.判断子序列
本题相对于连续最长公共子序列而言,本题不要考虑连续问题,不同的是更新公式的不同。可以看出,dp[i][j]的状态只能由前一个来推导出。也就是更新公式是唯一的,并且需要伴随的记录来保证存到最大值(因为不一定最后一个保存的是最长的)。可以看出,在原来的基础上加上了一个else的操作,也就是,如果当前的dp[i][j]在当前数字上不能被增加的话,就取上一个状态的最大值。上一个状态就是分别在两个字符串中前一个位置的两个状态,一个异步的操作。
2024-09-10 00:36:14
1075
原创 代码随想录27期|Python|Day49|动态规划| 300. 最长递增子序列|674. 最长连续递增序列|718. 最长重复子数组
关于本题,其实需要定义一个二维数组,因为需要在遍历一个数组的同时去遍历另外一个数组。基于初始化的考虑,在更新的时候需要调用前一次,而直接初始化数组第一个位置的dp数组比较麻烦,相当于需要先来遍历一遍了。所以基于此,在dp数组的定义上稍加改动。dp[i][j]表示以nums1的i-1和nums2的j-1为终止位置的最大重复子数组的长度。这样在初始化的时候较为方便。
2024-08-28 02:05:42
560
原创 代码随想录27期|Python|Day48|动态规划| 188.买卖股票的最佳时机IV|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费
代码随想录Day48完结!!!
2024-08-27 15:13:54
985
原创 代码随想录27期|Python|Day46|动态规划|121. 买卖股票的最佳时机|122. 买卖股票的最佳时机II|123. 买卖股票的最佳时机III
和之前必须卖出两次不一样,本题的状态有5种:(1)没有操作(2)第一次买入(3)第一次卖出(4)第二次买入(5)第二次卖出。
2024-08-27 00:41:54
1154
原创 代码随想录27期|Python|Day45|动态规划 | 198.打家劫舍| 213.打家劫舍II |337.打家劫舍III
采用一维数组,dp[i]表示当前到第i个物品的时候,所能取得的最大值(i物品不一定被取);
2024-08-17 15:58:26
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅