自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 最小 k 个数

本文介绍了一种基于快速排序的算法来查找数组中前k个最小元素。算法通过将数组分为三部分(小于、等于和大于基准值),并根据三部分元素数量与k的关系进行递归处理。当左区间元素数a>k时继续处理左区间;当a+b≥k时直接返回(b为等于区间元素数);否则递归处理右区间寻找剩余k-a-b个元素。该方法避免了完全排序,只需部分排序即可获得结果,时间复杂度接近于O(n)。代码实现了该逻辑,包含分区处理和递归调用过程。

2025-10-28 17:18:51 317

原创 排序数组(快速排序算法)

本文介绍了快速排序算法的实现思路和代码。算法核心分为两部分:1)区域划分:通过选取基准值key将数组划分为小于、等于和大于key的三个区域,使用left、right指针和遍历指针i进行交换操作;2)递归执行:对划分后的子数组重复上述过程直至完成排序。代码实现中使用了随机选取基准值的方法,并通过swap函数完成元素交换。该算法的时间复杂度为O(nlogn),是一种高效的排序方法。

2025-10-26 16:25:21 282

原创 数青蛙

这篇文章摘要(140字): 本文探讨了如何通过字符串分析确定青蛙鸣叫模式所需的最少青蛙数量。当字符串符合"croak"完整顺序时可重复使用一只青蛙;若出现重叠的"croak"序列则需要多只青蛙;若存在缺失或乱序则判定无效。作者提出采用数组下标映射结合哈希表的方法:用数组记录各字符出现次数,哈希表存储字符位置映射。遍历字符串时动态调整数组计数,最后校验数组状态判断字符串有效性,并返回所需青蛙数量或错误标识。

2025-10-25 16:11:49 332

原创 外观数列(模拟算法)

该文介绍了如何通过"解释数字字符串"的方式生成特定序列。使用双指针算法处理字符串,left指向起始位置,right遍历相同字符直到不同,计算字符出现次数。将"次数+字符"组合成新字符串,循环此过程n次。代码展示了具体实现,包括双指针遍历、字符串拼接和迭代生成结果。

2025-10-25 15:15:33 192

原创 只出现一次的数字 ||

摘要:本文介绍了一种通过比特位分析来找出数组中只出现一次数字的算法。对于每个比特位,统计所有数字该位的和,求余3后即可确定目标数字该位的值(0或1)。通过32位循环重构目标数字,最终返回结果。代码使用位运算实现,时间复杂度为O(n)。

2025-10-18 15:25:51 295

原创 判定字符是否唯一

本文提出了一种判断字符串中字符是否唯一的位图算法。通过将int变量的比特位对应26个小写字母,利用位运算高效记录字符出现情况:右移操作检测比特位是否被标记,位或操作设置比特位标记。当字符串长度超过26时直接判定为重复,时间复杂度O(n),空间复杂度O(1)。该方案相比哈希表更节省空间,适合处理限定字符集场景。

2025-10-15 18:12:01 278

原创 只出现一次的数字(位运算算法)

该文章介绍了如何找出数组中仅出现一次的两个数字的算法。首先通过连续异或操作得到两个目标数字的异或结果ret,再利用ret&(-ret)找到最低位1作为区分依据。最后遍历数组,根据该位是否为1将数字分组异或,最终得到两个只出现一次的数字。这种方法巧妙地利用了异或性质和位运算,时间复杂度为O(n),空间复杂度为O(1)。

2025-10-14 17:35:27 251

原创 和为 k 的子数组

本文介绍了一种使用前缀和与哈希表求解子数组和等于k的算法。算法思路是将问题转化为查找前缀和等于dp[i]-k的位置,利用哈希表记录各前缀和出现次数。具体实现时,初始化哈希表记录前缀和为0的情况,遍历数组时累加前缀和,并通过哈希表快速查询满足条件的子数组个数,最后更新哈希表。该方法高效简洁,时间复杂度为O(n)。

2025-10-10 19:56:24 227

原创 除自身以外数组的乘积

摘要:本文介绍了解决数组乘积问题的算法思路。通过构建前缀积和后缀积数组,分别计算每个位置左右两侧元素的乘积。关键点在于初始化时将首尾元素设为1,避免乘积为0的错误。最终结果数组的每个元素是相应位置前缀积和后缀积的乘积,时间复杂度为O(n)。该方法与"寻找数组中心下标"的思路类似,但需注意乘积运算的特殊性。

2025-09-30 17:14:41 172

原创 寻找数组的中心下标

本文介绍了使用双前缀和数组解决特定算法问题的方法。通过构建从左到右的前缀和数组(first_dp)和从右到左的"后缀和"数组(end_dp),可以高效比较任意位置左右两侧的元素和。代码实现先初始化这两个数组,然后遍历比较对应位置的数值,找到第一个左右和相等的位置索引。该方法优化了传统的单前缀和算法,时间复杂度为O(n)。

2025-09-29 18:15:33 162

原创 二维数组前缀和

这篇文章介绍了一种利用二维前缀和数组dp高效计算矩阵子区间和的方法。通过构建dp数组,其中每个元素存储从矩阵左上角到当前位置的累计和,可以快速响应多次查询。初始化dp时采用递推公式避免重复计算,查询时通过简单的加减运算即可得到任意子矩阵的和。该方法将每次查询的时间复杂度从O(n²)优化到O(1),解决了暴力模拟法在多次查询时的效率问题,并给出了完整的Java实现代码。

2025-09-28 17:54:00 457

原创 一维数组前缀和(前缀和算法)

本文介绍了使用前缀和数组高效解决区间和查询问题的方法。通过构建前缀和数组dp(下标从1开始),将原数组前n项和存储在dp[n]中,查询区间[L,R]和时只需计算dp[R]-dp[L-1]。这种方法将单次查询时间复杂度从O(n)降至O(1),特别适合多次查询场景。文中还解释了从1开始存储的原因:既符合人类计数习惯,又能简化边界处理(dp[0]=0)。代码部分展示了如何构建前缀和数组并进行查询操作。

2025-09-27 13:50:08 422

原创 0~n-1中缺失的数字

题目要求在0~n-1范围内找出唯一缺失的数字,已知数组长度为n-1且严格递增。解法思路:利用二分查找,通过比较数组元素与下标的对应关系确定缺失位置。当元素值等于下标时,缺失数在右侧;否则在左侧。特殊情况:若数组元素与下标完全对应,则缺失数为n。代码实现通过二分查找高效定位缺失数,时间复杂度为O(log n)。

2025-09-25 16:56:57 429

原创 寻找旋转排序数组中的最小值

摘要:本文介绍了在旋转有序数组中寻找最小值的两种二分查找方法。方法一以数组末尾元素为参照点,利用数值的二段性进行二分搜索;方法二则以数组首元素为参照点,需额外处理完全有序的特殊情况。两种方法都通过调整左右指针来缩小搜索范围,最终返回左指针指向的最小值元素。代码实现清晰展示了二分查找的核心逻辑和边界处理。

2025-09-24 13:34:09 208

原创 寻找峰值

本文介绍了查找数组峰值位置的算法思路。通过分析三种情况:单调递增、单调递减和波动变化,提出利用二分查找的解决方案。核心思想是根据中间元素与相邻元素的比较,判断峰值位于左半部或右半部,逐步缩小搜索范围。代码实现简洁高效,最终返回满足条件的峰值位置。

2025-09-23 13:54:38 349

原创 x 的平方根

这篇文章介绍了用二分查找求平方根的算法思路和实现。关键点在于:1)当mid平方≤x时,left=mid;2)当mid平方>x时,right=mid-1。特别强调了mid的取法要使用left+(right-left+1)/2避免死循环,因为当只剩两个相邻元素时,普通取中值会导致无限循环。代码实现中还对x<1的情况做了特殊处理。

2025-09-19 19:19:17 410

原创 在排序数组中查找元素的第一个和最后一个位置

这篇文章介绍了如何在非递减数组中查找目标值的起始和结束位置。使用二分查找算法,通过分别查找左端点和右端点来实现。查找左端点时,当mid值小于target时移动左指针,否则移动右指针;查找右端点时则相反。关键点在于循环条件(left<right)和中点计算方式(mid=left+(right-left+1)/2)的选择,以避免死循环和遗漏边界情况。最终返回包含两个端点的数组,若无目标值则返回[-1,-1]。

2025-09-19 17:29:03 619

原创 二分查找(二分查找算法)

二分查找算法通过每次取数组中间值,将搜索范围缩小一半:当中间值小于目标时排除左半部分,大于目标时排除右半部分,直到找到目标值。代码实现中需注意避免溢出风险,建议使用mid=left+(right-left)/2来计算中间位置。算法时间复杂度为O(logn),适用于有序数组的高效查找。

2025-09-18 17:17:52 325

原创 最小覆盖子串

摘要:本文介绍了一种使用滑动窗口和哈希表解决字符串最小覆盖子串问题的方法。通过维护两个哈希表分别记录目标字符串t和当前窗口的字符出现次数,使用双指针动态调整窗口范围。当窗口满足包含t所有字符的条件时,记录最小长度并移动左指针收缩窗口,否则移动右指针扩展窗口。最终返回满足条件的最短子串。该方法有效解决了在字符串s中寻找包含t所有字符的最短子串问题。

2025-09-17 19:22:27 613

原创 串联所有单词的子串

这篇文章介绍了一种解决字符串子串匹配问题的滑动窗口算法。该算法通过将字符串分割成固定长度的子串,使用哈希表记录子串出现次数,并维护有效元素计数器count。关键点包括:1) 滑动窗口需要执行len次(len为子串长度);2) 使用左右指针移动固定步长;3) 通过比较哈希表值来判断有效元素;4) 当count等于目标子串数量时记录结果。代码实现中特别注意了边界处理和使用substring方法获取子串。该算法是"字母异位词"问题的扩展,适用于处理字符串数组匹配场景。

2025-09-16 20:47:34 547

原创 找到字符串中所有字母异位词

题目要求找出字符串s中包含字符串p的字母异位词的所有起始下标。解法采用滑动窗口和双指针技术:定义两个数组分别统计p和当前窗口的字符频次,通过比较有效字符数m与p的长度len来判断异位词。当窗口大小超过len时移动左指针并调整计数,当m=len时记录当前左指针位置。该方法利用26位数组高效统计字符频次,避免了哈希表的复杂操作,时间复杂度为O(n)。核心思想是通过维护固定大小的滑动窗口和有效字符计数来优化判断过程。

2025-09-15 17:31:06 678

原创 水果成篮

本文介绍了在水果序列中寻找最多包含2种水果的最长连续子序列的两种解法。方法一采用暴力枚举+双指针,通过记录水果种类进行遍历;方法二优化使用哈希表(或数组模拟)记录水果种类和数量,通过移动左右指针维护窗口内水果种类不超过2种。最终返回遍历过程中记录的最大子序列长度。核心思路是通过滑动窗口动态调整左右边界,确保窗口内始终满足条件,同时更新最大长度。

2025-09-14 15:51:31 858

原创 将 x 减到 0 的最小操作数

题目要求将数组最左或最右元素依次减掉,转化为寻找最长子数组使其和等于总和减去x。方法一通过暴力枚举区间实现,但效率较低;方法二优化为滑动窗口:定义左右指针,动态调整窗口大小,当子数组和等于目标值时记录最大长度。最终返回原数组长度减去该子数组长度,若无解则返回-1。核心思路是将减法操作转化为求特定和的子数组问题。

2025-09-13 15:39:30 398

原创 最大连续 1 的个数

摘要:该题解探讨了如何找到翻转最多k个0后数组中的最大连续1个数。提出了两种解法:暴力枚举法(固定left移动right,记录翻转次数)和优化滑动窗口法(动态调整left和right指针,维护翻转次数不超过k)。最终给出Java实现代码,通过滑动窗口在O(n)时间内解决问题,其中关键点在于当翻转次数超过k时移动left指针到合适位置。

2025-09-12 21:21:08 364

原创 无重复字符的最长子串

本文介绍了查找字符串中最长无重复字符子串的两种解决方案。方案1采用暴力枚举法,通过双指针遍历所有可能子串,但效率较低;方案2优化为滑动窗口算法,利用哈希表记录字符出现次数,动态调整窗口边界,时间复杂度为O(n)。关键实现步骤包括:将字符串转为字符数组,使用ASCII值作为索引的哈希表统计字符频率,维护左右指针滑动窗口,及时更新最大长度。当遇到重复字符时,移动左指针并更新哈希表,确保窗口内始终无重复字符。最终代码简洁高效,适用于处理字符串相关问题。

2025-09-11 11:21:25 747

原创 长度最小的子数组(滑动窗口算法)

本文介绍了求解最小长度子数组和的滑动窗口算法。首先通过暴力枚举法分析问题,指出其效率问题。进而提出使用同向双指针(left和right)的滑动窗口优化方案:初始化指针和变量后,右指针移动累加元素,当和≥target时记录最小长度,左指针右移缩小区间。重复直到遍历完数组,返回最小长度值。代码实现中len初始化为最大值以避免首次比较错误。该算法时间复杂度为O(n),相比暴力枚举更高效。

2025-09-10 21:06:08 930

原创 四数之和

该文章介绍了一种解决四数之和问题的算法思路。主要采用排序+双重循环+双指针的方法:首先对数组排序,外层双重循环固定两个数a和b,内层使用双指针寻找满足条件的另外两个数(使四数之和等于目标值)。过程中需注意去重处理,避免重复四元组。代码实现时还加入了小优化:当数组元素不足四个或最小四个数之和已超过目标值时直接返回。该算法本质是在三数之和解法基础上增加了一层循环。

2025-09-09 18:05:27 458

原创 三数之和

本文介绍了一种利用双指针算法解决三数之和问题的方法。首先对数组排序,固定一个数后,使用左右指针在剩余区间寻找满足条件的另外两个数。通过跳过重复元素来避免重复解,同时包含优化处理:当固定数大于0时直接终止循环。代码实现部分展示了具体操作步骤,包括指针移动、结果存储和重复元素处理。该方法有效解决了三数之和问题,时间复杂度为O(n²)。

2025-09-08 21:49:36 899

原创 查找总价格为目标值的两个商品

摘要:该题目要求在一个升序数组中找出两数之和等于目标值的组合。解题思路采用双指针法,利用数组单调性优化搜索:左指针从数组头开始,右指针从数组尾开始。若两数之和小于目标值,则左指针右移;若大于目标值,则右指针左移;若相等则返回结果。该方法时间复杂度为O(n),比暴力枚举更高效。代码实现简洁明了,未找到匹配时返回空数组。

2025-09-07 15:36:40 401

原创 有效三角形的个数(数组单调性)

本文介绍了两种解决三角形三元组计数问题的方法。暴力枚举法通过三层循环实现,但时间复杂度达O(n³)效率较低。优化解法采用排序+双指针策略:先排序数组,固定最大元素后,用左右指针扫描较小元素。当两小边之和大于第三边时,直接统计中间所有可能组合并右移指针;否则左移指针。该算法显著提升了效率,时间复杂度主要取决于排序步骤。代码实现展示了如何通过Arrays.sort()和双指针遍历来高效解决问题。

2025-09-06 14:03:23 468

原创 盛最多水的容器

本文介绍了求解容器最大容积问题的双指针解法。题目要求计算数组中两个元素作为桶壁时,其高度和宽度的最大乘积。先分析暴力枚举法会超时,进而提出双指针优化方案:初始化左右指针分别指向数组两端,计算当前容积后,移动较小值的指针,逐步缩小范围。通过保持较高的桶壁来确保可能的更大容积,避免不必要的计算。该方法显著提高了效率,时间复杂度为O(n)。代码实现简洁明了,通过比较左右指针的值决定移动方向,并实时更新最大容积值。

2025-09-05 20:10:06 445

原创 快乐数(双指针)

摘要:本文介绍了一种判断快乐数(最终能变为1的数字)的算法。使用双指针法,定义快慢指针从初始数字n出发,慢指针每次计算一次数字各位平方和,快指针计算两次。通过循环直到两指针相遇,若结果为1则是快乐数,否则不是。代码实现了平方和计算函数add()和判断函数isHappy(),通过do-while循环和最终值比较完成判定。该方法巧妙利用了快慢指针在循环序列中的特性,有效解决了快乐数判定问题。

2025-09-04 17:07:47 219

原创 复写零(双指针)

摘要:本文介绍了处理数组中零元素复制的算法思路。使用双指针法,先确定最后一个要复写的元素位置,处理可能的越界情况。然后从后往前遍历数组,遇到零时复制两个零,非零元素则直接移动。特殊情况下需调整指针位置以避免越界。代码实现分为三步:确定复写位置、处理边界条件、执行反向复写操作。该算法能高效完成零元素的复制和数组重排任务。

2025-09-03 21:00:07 428

原创 移动零(双指针算法)

摘要:本文介绍了一种原地移动零元素的算法。使用双指针法,将数组分为非零区、零区和待处理区。dest指针标记非零区末尾,cur指针遍历数组。当cur遇到非零元素时,与dest+1位置的元素交换,保持非零元素相对顺序。时间复杂度O(n),空间复杂度O(1),无需额外数组空间。

2025-09-02 20:42:44 195

原创 Spring 框架(1)

Spring 框架(1)

2025-06-09 14:37:47 1358 33

原创 JVM 机制

JVM 机制

2025-05-17 20:21:29 1539 41

原创 HTTP / HTTPS 协议

HTTP / HTTPS 协议

2025-05-14 13:13:24 2361 41

原创 数据链路层(MAC 地址)

数据链路层(MAC 地址)

2025-05-05 14:38:20 2229 24

原创 IP 协议

IP 协议

2025-05-04 17:25:59 1755 25

原创 UDP / TCP 协议

UDP / TCP 协议

2025-05-03 19:28:44 3630 23

空空如也

空空如也

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

TA关注的人

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