自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Leetcode:416.分割等和子集

然后遍历数组中的每一个数字 num,对于每个 num,我们从 target 往下遍历到 num,如果 dp[j - num] 为 true,说明用之前的数字能凑出 j - num,那么加上当前的 num 就能凑出 j,所以 dp[j] 也应该为 true。如果从小到大遍历,dp[0] 为 true 会把 dp[1] 设为 true,然后 dp[1] 为 true 又会把 dp[2] 设为 true,这样一直传递下去,相当于用了无数次 1,这显然是错误的。首先对整个数组求和,记为 sum。

2026-08-08 11:46:47 168

原创 LeetCode:300.最长递增子序列

如果找不到(即 x 比所有 tails 元素都大),就把 x 追加到末尾,序列长度 +1。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。如果找到了,用 x 替换那个位置的值(因为更小的末尾值更有利于后续扩展):每个元素自己可以成为一个长度为 1 的序列,所以。结尾的序列后面,形成一个更长的递增子序列。,找到其中最长严格递增子序列的长度。所以还可以使用贪心加二分查找的思想。是严格递增的(可以用二分查找)。的最长递增子序列的长度。的位置(用二分查找)

2026-08-07 16:20:32 173

原创 LeetCode:152.乘积最大子数组

请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。因为负数会让最大值变成最小值,最小值也可能变成最大值。乘积(负数越小,将来乘负数可能越大),和最大和子数组类似,但因为。取最大值和最小值分别保存。,所以需要特殊处理。

2026-08-03 10:49:38 151

原创 LeetCode:279.完全平方数

想象你有无限多个面值为 1、4、9、16、25... 的硬币,要凑出 n 块钱,问最少用几个硬币。只不过这里的"硬币面值"正好是完全平方数。凑出 i 的最后一步,一定是加了一个平方数,比如 k²。那加上这个平方数之前,已经凑出了 i - k²。因为最后一步加 1、加 4、加 9、加 16... 都是可能的,我们得。这道题的困难之处就是能不能看出来它是一道完全背包问题,看出来之后,这道题就迎刃而解了。每种硬币可以无限次使用,求凑出目标金额的最少硬币数。只要 k² 不超过 i,所有平方数都要考虑。

2026-07-05 22:33:26 208

原创 LeetCode:763.划分字母区间

第三步,当遍历到索引 i 等于 end 时,说明当前片段内的所有字母都不会出现在 i 之后,可以在此处切割。比如对于字符串 "ababcbacadefegdehijhklij",字母 a 最后一次出现在索引8,b 最后一次出现在索引5,c 最后一次出现在索引7。第二步,再次遍历字符串,维护两个变量:start 表示当前片段的起始位置,end 表示当前片段的最远边界。每个字母在字符串中可能出现多次,为了保证同一字母最多出现在一个片段中,每个字母的第一次出现位置和最后一次出现位置必须被划分在同一个片段里。

2026-07-02 21:22:12 170

原创 LeetCode:347. 前 K 个高频元素

最后这个代码是使用桶排序,通过出现次数来分桶,相同出现次数会被分到一个桶,当ans.size()等于k的时候就会跳出结束,桶排序将时间复杂度降低到n,是这道题的最优解。这是我写的第一版代码,时间复杂度是nlogn,首先要手写比较器,增加代码的复杂度,而且建堆和维护都可以优化,从而优化时间复杂度。这是第二版代码,只维护一个小跟堆,并且只维护K的大小的堆,少了很多维护堆的消耗,也让时间复杂度优化到nlogk。,请你返回其中出现频率前。

2026-06-29 19:42:43 193

原创 LeetCode:215. 数组中的第K个最大元素

代码简单,也很好想,但是堆的时间复杂度是nlogn,题目要求n的时间复杂度,而且题目要求是第K个,不是前K个,所以这道题有更优解。平均复杂度作为n的确符合题目要求,但是过不了最后一个样例,因为样例中有大量重复样例,会导致最坏的时间复杂度也就是n的平方。解题思路:首先看到第K大的元素,第一反应可以是topK问题,用堆是解决topK问题的最优解法,所以有如下解法。这样的优化,解决了重复样例的问题,基本做到了稳定的O(n)快速选择作为n的平均时间复杂度解这道题,思路是。请注意,你需要找的是数组排序后的第。

2026-06-28 21:35:48 190

原创 力扣153:寻找旋转排序数组中的最小值

先定义结果ans=nums[0],然后在循环中找,如果nums[left]<=nums[mid],说明转折点在右半部分,这时候先给ans赋值为可见的最小值也就是nums[left],然后把left=mid+1,如果nums[left]<=nums[mid]为假,说明转折点就在左半部分,所以先让ans=nums[mid],然后让right=mid-1,继续二分查找,直到找到转折点。这道题和力扣33题很相似,都是旋转排序数组,但是33题是寻找目标值,这道题是寻找最小值。的数组,预先按照升序排列,经由。

2026-04-24 18:59:00 22

原创 力扣33:搜索旋转排序数组

这道题的不同之处是部分有序,所以我们的思路是这样的,当我们把这个数组分开,两部分的其中一部分一定是有序的,这时候我们找到有序的那一方来判断,目标值在不在这一部分,如果在,就在这一部分继续二分,如果不在就在另一部分二分。如何判断是否有序:如果nums[left]<=nums[mid],说明左半部分是有序的,否则就else到右半部分。如何判断目标值在不在范围内:nums[left]<=target<=nums[mid],说明目标值在左半部分。,则返回它的下标,否则返回。按升序排列,数组中的值。

2026-04-22 22:13:03 24

原创 LeetCode:42.接雨水

这道题的其中一个思路是,单独计算每一个单位可以接多少水,决定一个柱子能接多少水的是左右两边最高的柱子,比如2,1,3这样的情况,1能接的水由左边更高的2和右边更高的3决定,取两边最高的最小值,再减去柱子大小,就是这个柱子能接的水量。用pre_max来记录柱子左边的最高值,用suf_max来记录柱子右边的最高值。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。最后用ans来计算总和即可。

2026-02-04 14:50:15 173

原创 卡码网103.高山流水

这道题最开始的思路是遍历每一个点,然后深搜到边界,记录到达两个边界的点有哪些,但是这个时间复杂度太高了,有n^4的时间复杂度,一定超时。这道题的正确解法可以遍历四条边界,从边界的每一个点开始深搜,然后定义两种标记数组,在两个标记数组都到达的情况再进行输出。思路清晰后代码难度不高。

2026-01-24 14:17:48 36

原创 卡码网99.计数孤岛

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。bfs内,把每对x,y放入队列里,队列不空就代表这篇岛屿没有遍历完,通过方向数组,dx,dy遍历四个方向,找到未访问的陆地就加入队列。这是一道图论的基础题,有dfs和bfs两种解法,我们选择使用bfs来求解,两种方法效果是差不多的。遍历所有点找到是陆地且未被访问的,就是找到了新的孤岛,ans++代码中的g数组用来记录是陆地还是水,v数组记录是否访问过。

2026-01-23 14:05:03 31

原创 LeetCode:115.不同的子序列

所以思考dp数组的初始化,dp[i][0]代表s[i]中有多少空串,也就是1,而dp[0][j]则是空串有多少个t,那就是0,最后思考dp[0][0],空串里有多少个空串就是1个。接下来思考,如果遍历到i和j相等的话,要考虑是否使用当前的s[i-1],如果使用,就是dp[i-1][j-1],如果不使用,就是dp[i-1][j]首先思考dp数组的含义,dp[i][j]代表的是在s的i-1之前有多少个t的j-1。测试用例保证结果在 32 位有符号整数范围内。这是一道动态规划问题。

2026-01-22 12:08:59 61

原创 LeetCode:1143. 最长公共子序列

是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。这道题依旧是动态规划思想,和718的最迟重复子数组类似,但是可以不连续,只要顺序是对的即可。到dp[i][j]后看这两个字符是否相等,相等则+1,不相等则取前面的数。所以dp数组的含义是,遍历到i和j拥有的最长公共子序列。是这两个字符串所共同拥有的子序列。,返回这两个字符串的最长。

2026-01-20 13:02:16 40

原创 LeetCode:198.打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,所以完整的递推公式就是dp[i]=max(dp[i-1],dp[i-2]+nums[i]);如果前一间没被偷,就可以偷这间,所以dp[i]=dp[i-2]+nums[i]对于一间屋子来讲有两种情况,一种是前一间被偷了,一种是前一间没被偷。如果前一间被偷了,就不能偷这间,所以dp[i]=dp[i-1]给定一个代表每个房屋存放金额的非负整数数组,计算你。这道题是一道动态规划问题。

2026-01-17 12:00:00 40

原创 卡码网56:携带矿石资源

多重背包就是一个扩展的01背包,假设数量级都是n的话,时间复杂度达到了O(n^3)因为这道题有数量限制,所以这是一道经典的多重背包问题。在01背包的基础上加一层循环遍历数量即可。

2026-01-16 15:00:00 36

原创 LeetCode:139.单词拆分

因为vector中没有find函数,所以转到unordered_set。因为字典中的单词可以重复使用,所以这是一个完全背包问题。这个一定是有排序的,所以要先遍历背包,后遍历物品。将dp[0]设置为true,其他设为false。字符串就是背包,字典就是物品。

2026-01-15 15:00:00 42

原创 LeetCode:322.零钱兑换

要注意 dp[i - coins[j]]可能没有到达,也就是INT_MAX,所以要跳过。零钱的面值就是物品大小,然后一枚硬币价值就是1,amount就是背包容量。因为每种硬币的数量是无限的,所以这是一个完全背包问题。因为要求最小硬币数,所以将dp数组初始化为最大值。0的容量需要0 个硬币,所以定义dp[0]=0。这道题是组合而非排列,先遍历背包再遍历物品。

2026-01-14 14:23:01 44

原创 LeetCode:474.一和零

递推公式:dp[i][j] = max(dp[i][j], dp[i - zero][j - one] + 1);然后dp[i][j]中的i是容纳0的背包,j是容纳1的背包。这道题也是动态规划思想,把每一个字符串当成一个物品。dp数组初始化为0即可。

2026-01-08 17:00:00 158

原创 LeetCode:494.目标和

首先根据题意有三个数,一个是加号数的和,一个是减号数的和,还有是总和sum,设加号数的和为x,那减号数的和就是sum-x,target=x-(sum-x),所以x=(target+sum)/2,所以我们把这个数设为背包大小,只找为加号的数的部分。所以递推公式dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]];递推公式dp[i][j]的值包括当前物品i是否放入,如果不放入,其值是dp[i-1][j],如果放入,其值即为dp[i-1][j-nums[i]]

2026-01-07 19:42:59 204

原创 LeetCode:738.单调递增序列

首先我们要从低位向高位遍历,如果下一位高于上一位,就将上一位减1来保证数字小于等于原数,然后将上一位用flag记下来,这样可以把后面的数都设置为9,最后可以保证只有一位被减1,因为数据量达到10的9次方,所以暴力一定会超时;高位的符合非递减的顺序,低位全是9;当且仅当每个相邻位数上的数字。的最大数字,且数字呈。时,我们称这个整数是。

2025-12-07 17:53:43 162

原创 LeetCode:435.无重叠区间(贪心算法)

要删除最少的重叠区间,也就是要尽可能保留多的区间,所以要让区间尽可能短;我们可以找到额外的交点然后计数,再用总数-交点得到答案;所以推荐以end开始排序;

2025-12-06 17:39:57 245

原创 卡码网46:携带研究材料(01背包)

因为i的数据都是从i-1获得的,所以dp[i][j]=max(dp[i-1][j],dp[i-1][j-space[i]+worth[i]);和dp[i][j]=max(dp[i][j],dp[i][j-space[i]+worth[i]);区别并不大,所以我们可以简化成dp[j]=max(dp[j],dp[j-space[i]+worth[i]);滚动数组的优化对空间优化极大,空间复杂度从O(n*m)优化到O(max(n,m))。同时可以通过j>=space[i]优化if判断。第二种方法:滚动数组优化。

2025-12-05 21:32:41 225

空空如也

空空如也

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

TA关注的人

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