自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 11种排序算法的Python代码实现

【代码】11种排序算法的Python代码实现。

2025-10-26 14:58:32 573

原创 Leetcode 327. 区间和的个数

求nums的前缀和数组,并对前缀和数组使用归并排序算法进行排序,在排序过程的归并之前,使用双指针算出rarr[j]-larr[i]在[lower,upper]区间的(i,j)的组合对数,并使用全局变量进行统计总对数,即为题解。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

2025-07-23 09:30:54 308

原创 Leetcode 204. 计数质数

给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。https://leetcode.cn/problems/count-primes/description/线性筛 / 埃氏筛线性筛方法代码埃氏筛方法代码4.执行结果

2025-07-22 09:07:27 234

原创 Leetcode 705. 设计哈希集合

void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。bool contains(key) 返回哈希集合中是否存在这个值 key。不使用任何内建的哈希表库设计一个哈希集合(HashSet)。void add(key) 向哈希集合中插入值 key。链地址法构建哈希集合。

2025-07-21 09:06:29 314

原创 Leetcode 710. 黑名单中的随机数

设计一种算法,从 [0, n - 1] 范围内的任意整数中选取一个 未加入 黑名单 blacklist 的整数。记m=len(blacklist),将[0,n-m)范围内的黑名单元素映射到[n-m,n)范围内的非黑名单元素,然后在[0,n-m)范围内进行随机选择,当选择到黑名单元素时,映射到[n-m,n)范围内的非黑名单元素。Solution(int n, int[] blacklist) 初始化整数 n 和被加入黑名单 blacklist 的整数。优化你的算法,使它最小化调用语言 内置 随机函数的次数。

2025-07-20 09:02:17 183

原创 Leetcode 3497. 分析订阅转化

第一步,基于UserActivity表格,按user_id和activity_type进行分组聚合,统计activity_duration的平均每日活动时长(筛掉cancelled的行),得到表格T1。第二步,基于T1分别筛选出activity_type=free_trial和activity_type=paid的行,记为表格T2和T3;然后将T2和T3按user_id进行内连接,即得到题解。activity_type 是('free_trial', 'paid', 'cancelled')中的一个。

2025-07-17 08:43:06 441

原创 Leetcode 972. 相等的有理数

对于0.(12)这样的数,等于(12/100+12/10000+12/1000000+...),可以发现是12乘以一个等比数列的和,记r=10*给定两个字符串 s 和 t ,每个字符串代表一个非负有理数,只有当它们表示相同的数字时才返回 true。字符串中可以使用括号来表示有理数的重复部分。有理数 最多可以用三个部分来表示:整数部分 、小数非重复部分 和小数重复部分 <(><)>。r/(1-r)(其中k为括号中的数的长度)。(-k),x=12,则求极限可知原数等于x。

2025-07-16 08:57:38 346

原创 Leetcode 3315. 构造最小位运算数组 II

举个栗子:10011|10100=10111,可以看出x|(x+1)是将x最右边的0替换为1后的结果;所以求最小化结果,等价于求最低位0,将最低位0后面的1替换为0后的值,即为最小化结果。第二步,求最低位0后面的元素1。先取反,然后求最低有效位,再将最低有效位右移一位即为最低位0后面的1,记为a。如果没法找到符合 条件 的 ans[i] ,那么 ans[i] = -1。质数 指的是一个大于 1 的自然数,且它只有 1 和自己两个因数。第一步,由题意易得数字不能是偶数,而质数中只有2为偶数,所以排除2。

2025-07-14 08:53:15 315

原创 Leetcode 3554. 查找类别推荐对

返回可报告类别对的结果表以 customer_count 降序 排序,并且为了防止排序持平,以 category1 字典序 升序 排序,然后以 category2 升序 排序。如果至少有 3 个不同的客户购买了两个类别的产品,则类别对被视为 可报告的。第二步,T1表格进行自连接,并确保user_id相等和category1。(user_id, product_id) 是这张表的唯一主键。对于 每个类别对,确定 同时 购买了两类别产品的 不同用户 数量。product_id 是这张表的唯一主键。

2025-07-10 09:19:03 399

原创 Leetcode 393. UTF-8 编码验证

对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为 0 ,后面字节的前两位一律设为 10。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。开头连续1的一个的不能作为单字符,为非法子串。给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码。第一步,找到data[i]开头连续1的个数,确定当前字符串的位数digit。时间复杂度:O(n)

2025-07-09 08:44:15 363

原创 Leetcode 1154. 一年中的第几天

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。知识点:闰年判定+月份天数。

2025-07-08 08:40:47 440

原创 Leetcode 1070. 产品销售分析 III

返回一张有这些列的表:product_id,first_year,quantity 和 price。编写解决方案,选出每个售出过的产品 第一年 销售的 产品 id、年份、数量 和 价格。这张表的每一行都表示:编号 product_id 的产品在某一年的销售额。(sale_id, year) 是这张表的主键(具有唯一值的列的组合)。等价于各个产品最早销售的年份的销售信息,直接使用窗口函数RANK即可。product_id 是产品表的外键(reference 列)。返回该产品在该年度的 所有 销售条目。

2025-07-07 07:44:10 363

原创 Leetcode 214. 最短回文串

如果不相等,且上一个最长相同前后缀的长度不为0,需要缩减上一个最长前后缀长度,将其缩减为上一个最长相同前后缀的最长相同前后缀,根据pmArr的前置的信息更新prefixLen。让i和j指针分别指向被匹配串和模式串的元素,i指针不后退的遍历主串。如果不相等,且j指针没有指向模式串的头部,则根据从pmArr中取出的j-1处元素结尾的最长前后缀的长度,并以此更新j的指针位置。将s[::-1]作为查询串,s作为模式串,题目可以转换为求s[::-1]匹配的最长子串长度,也等价于求s模式串中指针最终指向的位置。

2025-07-06 15:44:49 355

原创 Leetcode 1103. 分糖果 II

第二步,记n=num_people,则前m%n个小孩的所有分配都是足额的,第m%n+1个小孩最后一次没有分配或者分配不足额,第m%n+2个及后面的小孩最后一轮没有分配到糖果;注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。2.2.在不考虑最后一轮分配的情况下,计算第m%n+1个及后面的小孩分配的糖果数。

2025-07-04 08:10:31 414

原创 Leetcode 982. 按位与为零的三元组

枚举二进制子集方法:枚举m的非空子集,记子集s=m,迭代s=(s-1)&m,其中&m是为了排除s-1时出现的非m子集情况。2.2.求m的各个子集,并将个数合并到cnts中;当子集s==0时,(s-1)&m==m,此时while循环退出。nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。第二步,求nums中各个元素的二进制集合补集的子集,并统计个数,记为数组cnts(长度为u)第三步,从nums中进行两两枚举x,y,统计cnts[x&y]的和,即为题解。

2025-07-03 10:26:58 526

原创 Leetcode 3421. 查找进步的学生

第二步,基于T1,根据student_id和subject进行分组聚合,此时的每个学生、学科的first_score相同且last_score也相同,则只需使用MAX/MIN进行聚合筛选即可。第一步,使用窗口函数FIRST_VALUE获取各个学生和学科在最早和最晚的考试日期的考试分数,分别记为字段first_score和last_score,表格记为T1。(student_id, subject, exam_date) 是这张表的主键。他们在该学科 最近的分数 比他们 第一次该学科考试的分数更高。

2025-07-03 09:42:16 293

原创 Leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复

bool remove(int val) 如果存在,从集合中移除一个 val 项。如果该项存在,则返回 true ,否则返回 false。bool insert(int val) 将一个 val 项插入到集合中,即使该项已经存在。如果该项不存在,则返回 true ,否则返回 false。int getRandom() 从当前的多个元素集合中返回一个随机元素。每个元素被返回的概率与集合中包含的相同值的数量 线性相关。您必须实现类的函数,使每个函数的 平均 时间复杂度为 O(1)。

2025-07-02 08:13:01 394

原创 Leetcode 262. 行程和用户

这张表中存所有用户,每个用户都有一个唯一的 users_id ,role 是一个表示用户身份的枚举类型,枚举成员为 (‘client’, ‘driver’, ‘partner’)。status 是一个表示行程状态的枚举类型,枚举成员为(‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。每段行程有唯一 id ,其中 client_id 和 driver_id 是 Users 表中 users_id 的外键。

2025-07-01 08:37:12 794

原创 Leetcode 1393. 股票的资本损益

此表可以保证,股票的每个“卖出”操作在前某一天都有相应的“买入”操作。并且,股票的每个“买入”操作在即将到来的某一天都有相应的“卖出”操作。此表的每一行代表了名为 stock_name 的某支股票在 operation_day 这一天的操作价格。(stock_name, operation_day) 是这张表的主键(具有唯一值的列的组合)operation 列使用的是一种枚举类型,包括:('Sell','Buy')股票的 资本利得/损失 是指一次或多次买卖该股票后的总收益或损失。以 任意顺序 返回结果表。

2025-06-30 08:14:59 424

原创 Leetcode 3482. 分析组织层级

层级:对于每名员工,确定他们在组织中的层级(CEO 层级为 1,CEO 的直接下属员工层级为 2,以此类推)。薪资预算:对于每个经理,计算他们控制的总薪资预算(所有手下员工的工资总和,包括间接下属,加上自己的工资)。第三步,基于T2根据group_id进行分组聚合,计算团队大小(注意减去老大本身的一个)、团队预算薪资。每一行包含关于一名员工的信息,包括他们的 ID,姓名,他们经理的 ID,薪水和部门。团队大小:对于每个是经理的员工,计算他们手下的(直接或间接下属)总员工数。第一步,递归获取各个员工的层级。

2025-06-29 08:34:54 415

原创 Leetcode 3321. 计算子数组的 x-sum II

cnts维护当前窗口中的元素的频数;leftMinHeap维护窗口中频数前k大的元素对,rightMaxHeap维护窗口中非前k大的元素对;返回一个长度为 n - k + 1 的整数数组 answer,其中 answer[i] 是 子数组 nums[i..i + k - 1] 的 x-sum。如果cnts[nums[i-k]]>0,将更新后的nums[i-k]的频数堆压入左堆中。注意,如果数组中的不同元素少于 x 个,则其 x-sum 是数组的元素总和。将更新后的nums[i]的频数对压入堆中。

2025-06-28 09:25:16 543

原创 Leetcode 3389. 使字符频率相等的最少操作次数

此时dp[i]_2=dp[i-2]+min(abs(counts[i-1]-targetCount),counts[i-1])+min(abs(counts[i]-targetCount),counts[i])。3.2.第一种情况,假定第i-1个字符的字符数已经变成了targetCount或者0,此时dp[i]_1=dp[i-1]+min(abs(targetCount-counts[i]),counts[i])。当counts[i]==0,dp[i]=dp[i-1]从 s 中删除一个字符。

2025-06-27 08:36:19 654

原创 Leetcode 400. 第 N 位数字

记digit为数位,即某个数中数字的个数;1-9共有9个数,10-99共90个数,100-999共900个数,找规律可知数位为digit的数共有10*给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。所以可以从小到大枚举digit,将总数个数在n内的数位排除,找到目标数的digit,并找出目标数以及最终数字在目标数中位置。

2025-06-26 10:00:26 1029

原创 Leetcode 719. 找出第 K 小的数对距离

给你一个整数数组 nums 和一个整数 k ,数对由 nums[i] 和 nums[j] 组成且满足 0 <= i < j < nums.length。排序+二分查找+双指针。首先升序排列nums,则所有数对距离都在区间a=[0,nums[-1]-nums[0]]之间;所以题目等价于在区间a中找到最小的x,满足存在k个数对距离小于等于x。第二步,构建函数getCnt获取nums中数对距离小于等于参数x的数对的个数。数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。

2025-06-25 09:23:39 388

原创 Leetcode 854. 相似度为 K 的字符串

heap维护最小堆,堆中元素项的模式为(实际距离+预估距离,当前s1字符串的状态,当前遍历到的指针位置);对于某些非负整数 k ,如果交换 s1 中两个字母的位置恰好 k 次,能够使结果字符串等于 s2 ,则认为字符串 s1 和 s2 的 相似度为 k。第一步,构建计算s1状态s到s2的预估距离的函数getEstimateDist,这里通过两状态之间的至小交换次数进行表示。第二步,构建获取s1的下一个状态的函数getNeigh,返回下一个状态的s1字符串列表。2.2.跳过当前s1状态s与s2相同的字符。

2025-06-24 09:07:19 783

原创 Leetcode 2569. 更新数组后处理求和查询

操作类型 1 为 queries[i] = [1, l, r]。操作类型 2 为 queries[i] = [2, p, 0]。对于 0 <= i < n 中的所有下标,令 nums2[i] = nums2[i] + nums1[i] * p。给你两个下标从 0 开始的数组 nums1 和 nums2 ,和一个二维数组 queries 表示一些操作。操作类型 3 为 queries[i] = [3, 0, 0]。求 nums2 中所有元素的和。请你返回一个 数组,包含 所有第三种操作类型 的答案。

2025-06-23 10:39:30 299

原创 Leetcode 480. 滑动窗口中位数

给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。[2,3],中位数是 (2 + 3) / 2 = 2.5。[2,3,4],中位数是 3。

2025-06-22 08:58:56 818

原创 Leetcode 440. 字典序的第K小数字

第三步,记steps=getSteps(val),如果k>=steps,则第k小的节点不在当前节点的子树中,节点往当前节点的右相邻兄弟节点走,更新val=val+1,更新k=k-steps;如果k<steps,则第k小的节点一定在当前节点的子树中,节点往当前节点的最左侧子节点走,更新val=val*10,更新k=k-1。记第i小结点为ni,ni子树中节点数为steps,由于进行的是前序遍历,则如果k-i>=steps,第k小的节点一定不在ni的子树中,则需要往ni的右侧相邻兄弟节点进行遍历;

2025-06-21 08:35:24 327

原创 Leetcode 3445. 奇偶频次间的最大差值 II

2.1.构建维护变量。minPreSums维护各个情况下的最小前缀和(x的出现记为1,y的出现记为-1,其他记为0,大小等于cnts1[x]-cnts1[y]),minPreSums[0][0]维护偶数个x和偶数个y构成的最小前缀和,minPreSums[0][1]维护偶数个x和奇数个y构成的最小前缀和,minPreSums[1][0]维护奇数个x和偶数个y构成的最小前缀和,minPreSums[1][1]维护奇数个x和奇数个y构成的最小前缀和。第二步,枚举x和y,在每种x,y的组合中进行滑窗。

2025-06-20 09:38:34 304

原创 Leetcode 2490. 回环句

例如,"leetcode exercises sound delightful"、"eetcode"、"leetcode eats soul" 都是回环句。然而,"Leetcode is cool"、"happy Leetcode"、"Leetcode" 和 "I like Leetcode" 都 不 是回环句。否则,返回 false。句子 是由单个空格分隔的一组单词,且不含前导或尾随空格。句子中每个单词的最后一个字符等于下一个单词的第一个字符。最后一个单词的最后一个字符和第一个单词的第一个字符相等。

2025-06-19 09:40:07 328

原创 Leetcode 28. 找出字符串中第一个匹配项的下标

如果不相等,且上一个最长相同前后缀的长度为0,说明是初始化情况或者递推到这里了,这种情况i处元素结尾的最长相同前后缀的长度为0,更新pmArr数组;如果不相等,且上一个最长相同前后缀的长度不为0,需要缩减上一个最长前后缀长度,将其缩减为上一个最长相同前后缀的最长相同前后缀,根据pmArr的前置的信息更新prefixLen。如果不相等,且j指针指向模式串的开头,则i指针前进一位;如果不相等,且j指针没有指向模式串的头部,则根据从pmArr中取出的j-1处元素结尾的最长前后缀的长度,并以此更新j的指针位置。

2025-06-18 10:17:25 434

原创 Leetcode 2523. 范围内最接近的两个质数

如果有多个整数对满足上述条件,请你返回 nums1 最小的质数对。如果不存在符合题意的质数对,请你返回 [-1, -1]。第二步,由于筛选出来的primes是有序的,所以可以二分找到[left,right]之间的第一个质数,记其在primes数组中的下标为index。筛选出[2,10*6+1]之间所有的质数,构建primes数组。nums2 - nums1 是满足上述条件的质数对中的 最小值。第三步,遍历index后面的质数,求质数间隔最小的质数对。线性筛+二分查找 / 埃氏筛+二分查找。

2025-06-17 10:07:31 344

原创 Leetcode 2389. 和有限的最长子序列

返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度。最长的子序列长度一定是最小的k个元素组成的序列,所以可以先升序排列nums,然后贪心的取前面的元素和。给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries。子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。

2025-06-16 09:30:41 277

原创 Leetcode 2093. 前往目标城市的最小费用

输入包含一个二维数组 highways ,其中 highways[i] = [city1i, city2i, tolli] 表示有一条连接城市 city1i 和 city2i 的双向公路,允许汽车缴纳值为 tolli 的费用从 city1i 前往 city2i 或 从 city2i 前往 city1i。第二步,使用堆进行遍历。堆中结点的形式为(结点到start的结点的距离,当前结点,剩余的折扣数)2.5.遍历邻结点并将新的结点压入堆中(分为不使用折扣的结点和使用折扣的虚拟结点)Dijkstra算法。

2025-06-15 17:15:48 350

原创 Leetcode 398. 随机数索引

int pick(int target) 从 nums 中选出一个满足 nums[i] == target 的随机索引 i。如果存在多个有效的索引,则每个索引的返回概率应当相等。给你一个可能含有 重复元素 的整数数组 nums ,请你随机输出给定的目标数字 target 的索引。你可以假设给定的数字一定存在于数组中。Solution(int[] nums) 用数组 nums 初始化对象。哈希表 / 鱼塘抽样。

2025-06-14 09:09:00 298

原创 Leetcode 2604. 吃掉所有谷子的最短时间

对于二分检查的思路,不递减的枚举母鸡和谷子的位置,贪心的让谷子被最左边的母鸡吃掉,如果不能,则尝试让下一个母鸡吃掉,最后判断所有谷子能否被全部吃掉。给定两个整数数组 hens 和 grains ,它们的大小分别为 n 和 m ,表示母鸡和谷子的初始位置。2.3.判断当前的l和r范围内的谷子能否被当前的母鸡在时间t内吃完;如果一只母鸡和一颗谷子在同一个位置,那么这只母鸡可以吃掉这颗谷子。一只母鸡也可以吃掉多颗谷子。i维护当前母鸡的指针,p维护当前谷子的指针,l和r维护时间t内当前母鸡能够吃掉谷子的最大范围。

2025-06-13 08:00:01 1033

原创 Leetcode 3299. 连续子序列的和

dpdown[i][0]+=dpdown[i+1][0]+1,dpdown[i][1]+=dpdown[i+1][1]+i*(dpdown[i+1][0]+1)(注:这里使用的是+=的递推符号,因为nums后面可能出现重复的数字)例如,[3, 4, 5] 是一个值为 12 的连续数组,并且 [9, 8] 是另一个值为 17 的连续数组。数组的 值 是其元素的和。

2025-06-12 09:13:07 518

原创 Leetcode 2093. 前往目标城市的最小费用

输入包含一个二维数组 highways ,其中 highways[i] = [city1i, city2i, tolli] 表示有一条连接城市 city1i 和 city2i 的双向公路,允许汽车缴纳值为 tolli 的费用从 city1i 前往 city2i 或 从 city2i 前往 city1i。第二步,使用堆进行遍历。堆中结点的形式为(结点到start的结点的距离,当前结点,剩余的折扣数)2.5.遍历邻结点并将新的结点压入堆中(分为不使用折扣的结点和使用折扣的虚拟结点)Dijkstra算法。

2025-06-11 09:14:06 417

原创 Leetcode 569. 员工薪水中位数

先在with中统计每个公司的员工数量,然后使用窗口函数计算每个公司按salary升序排列的行号,然后判断每一个记录是不是中位数记录,最后筛选即可。id 是该表的主键列(具有唯一值的列)。编写解决方案,找出每个公司的工资中位数。该表的每一行表示公司和一名员工的工资。以 任意顺序 返回结果表。表: Employee。请参考思路部分和注释。

2025-06-10 11:04:27 287

原创 Leetcode 3390. Longest Team Pass Streak

第二步,使用窗口函数SUM,按team1分组、time_stamp进行升序排列,计算flag字段的前缀和,即为flag_prefix字段,得到表格T2。第一步,将team_name绑定到passes表格中,记字段flag为传球的状态(成功传球为0,失败为1),得到表格T1。第四步,按team_name进行分组聚合,统计streak的最大值记为longest_streak字段,即为题解。第三步,按team1,flag_prefix进行聚合,如果flag_prefix=0,COUNT(

2025-06-09 08:34:15 898

空空如也

空空如也

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

TA关注的人

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