自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode-代码随想录-图论-计数孤岛(广搜版)

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。后续 N 行,每行包含 M 个数字,数字为 1 或者 0。输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。第一行包含两个整数 N, M,表示矩阵的行数和列数。题目中每座岛屿只能由。相邻的陆地连接形成。

2025-11-21 09:06:02 394

原创 string(32字节)短字符串使用SSO,长字符串使用堆分配

对象地址: 0x21d52844880。数据地址: 0x21d52844890。对象地址: 0x21d528448a0。数据地址: 0x21d528448b0。

2025-11-20 22:34:48 202

原创 vector的push_back和emplace_back有什么区别?

【简要回答】当size达到capacity时,vector 会扩容来保持连续性。扩容过程包括计算新容量(通常是2倍)、分配新内存并构造新元素、迁移旧数据、释放旧内存、更新内部指针五个步骤。迁移数据时会根据元素类型选择最优策略,如内置类型使用SSE指令批量搬运,复杂类型优先使用移动构造。扩容后所有指向旧内存的迭代器都会失效。【详细回答】如果,添加新元素会触发扩容。这是保证元素内存连续性的必要操作。扩容步骤如下:vector会申请更大的连续内存,新容量通常是旧容量的倍数。

2025-11-20 22:21:31 1206

原创 leetcode-代码随想录&卡码网-图论-计数孤岛(深搜版)

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。后续 N 行,每行包含 M 个数字,数字为 1 或者 0。输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。该代码的 dfs函数的终止条件 在 for 循环里面的。第一行包含两个整数 N, M,表示矩阵的行数和列数。,是,才会去 调用 dfs函数,相邻的陆地连接形成。

2025-11-20 17:51:05 442

原创 leetcode-代码随想录&卡码网-图论-广度优先搜索理论基础

从start起点开始,是一圈一圈,向外搜索,方格编号1为第一步遍历的节点,方格编号2为第二步遍历的节点,第四步的时候我们找到终止点end。用一个方格地图,假如每次搜索的方向为 上下左右(不包含斜上方),那么给出一个start起始位置,那么BFS就是从四个方向走出第一步。因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。这一圈一圈的搜索过程是怎么做到的,是放在什么容器里,才能这样去遍历。需要一个容器,能保存我们要遍历过的元素就可以,

2025-11-12 16:32:41 310

原创 leetcode-代码随想录&卡码网-图论-可达路径

例如正确的答案是。

2025-11-12 16:31:37 847

原创 leetcode-代码随想录-图论-深度优先搜索 DFS

【代码】leetcode-代码随想录-图论-深度优先搜索 DFS。

2025-11-12 16:28:25 197

原创 leetcode-代码随想录-图论-理论基础

该无向图中 节点1、节点2、节点5 构成的子图就是 该无向图中的一个连通分量,该子图所有节点都是相互可达到的。节点6、节点7、节点8 构成的子图 不是强连通分量,因为这不是强连通图,节点8 不能达到节点6。节点1、节点2、节点3、节点4、节点5 构成的子图是强连通分量,因为这是强连通图,也是极大图。节点1、节点2、节点5 构成的子图 也不是 强连通分量,因为这不是极大图。同理,节点3、节点4、节点6 构成的子图 也是该无向图中的一个连通分量。无向图的度:无向图中有几条边连接该节点,该节点就有几度。

2025-11-12 16:27:42 308

原创 leetcode-代码随想录-单调栈-84柱状图中最大的矩形

以 heights[i] 为高的矩形面积 = heights[i] × (右边界 - 左边界 - 1)对于每个柱子 heights[i],以它为高度的最大矩形的宽度由左右两边第一个比它矮的柱子决定。给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。在代码中对数组的开头和结尾加了 0。求在该柱状图中,能够勾勒出来的矩形的最大面积。你的发展往往被你的短板限制,而不是长板!:快速找到"谁是限制你发展的那个人"

2025-11-12 16:26:14 256

原创 leetcode-代码随想录-单调栈-42接雨水

每个位置能接的雨水量 = min(左边最大高度, 右边最大高度) - 当前高度。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。按列来计算,求出每列的雨水体积,相加之后就是总雨水体积。个非负整数表示每个宽度为。

2025-11-12 16:24:51 541

原创 leetcode-代码随想录-单调栈-503下一个更大元素Ⅱ

将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。这种写法确实比较直观,但做了很多无用操作,例如修改了nums数组,而且最后还要把result数组resize回去。resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了一个O(n)的操作。

2025-11-12 16:23:54 432

原创 leetcode-代码随想录-单调栈-496下一个更大元素Ⅰ

如果不存在下一个更大元素,那么本次查询的答案是。给你两个** 没有重复元素** 的数组。中找下一个更大元素。

2025-11-12 16:23:07 444

原创 leetcode-代码随想录-单调栈-739每日温度

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用。单调栈里元素是递增呢?(从栈头到栈底的顺序),表示每天的温度,返回一个数组。使用单调栈主要有三个判断条件。单调栈里存放的元素是什么?

2025-11-12 16:13:29 384

原创 leetcode-代码随想录-动态规划-总结篇

基础系列分为:斐波那契数类、路径规划类、整数划分类。

2025-10-28 17:43:51 621

原创 leetcode-代码随想录-动态规划-516最长回文子序列

从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1]。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。红色框即:dp[0][s.size() - 1];,找出其中最长的回文子序列,并返回该序列的长度。:表示字符串 s 中从索引 i 到 j(左闭右闭。)的子串中最长回文子序列的长度。从下到上遍历,从左向右遍历。

2025-10-28 17:42:49 366

原创 leetcode-代码随想录-动态规划-647回文子串

题目链接:647. 回文子串 - 力扣(LeetCode)给你一个字符串 ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。思路1. DP数组含义判断回文:尝试几种定义::表示字符串 s 中从索引 i 到 j (左闭右闭[i, j])的子串是否为回文串2. 递推公式情况一:情况二:就是统计回文子串的数量。3. DP数组初始化dp[i][j]初始化为false。4. 确定遍历顺序在下标 i 与 j 相差

2025-10-28 17:42:08 424

原创 leetcode-代码随想录-动态规划-72编辑距离

dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。当前字符不同,有三种操作选择:(将。所使用的最少操作数。从上到下从左到右去遍历。

2025-10-28 17:41:25 1159

原创 leetcode-代码随想录-动态规划-583两个字符串的删除操作

dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同。dp[0][j]:word1为空字符串,以j-1为结尾的字符串word2要删除多少个元素,才能和word1相同。,相等 所需 的 最少 删除操作次数。可以删除任意一个字符串中的一个字符。,所以递推公式可简化为。

2025-10-28 17:40:47 968

原创 leetcode-代码随想录-动态规划-115不同的子序列

即s[3] == t[2],可以选择使用当前s[3]匹配 t[2],也可以使用 s[2]来匹配;测试用例保证结果在 32 位有符号整数范围内。

2025-10-28 17:40:08 1010

原创 leetcode-代码随想录-动态规划-392判断子序列

如果有大量输入的 S,称作 S1, S2, …, Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。:双重循环,都从前往后。

2025-10-28 17:39:27 884

原创 leetcode-代码随想录-动态规划-53最大子数组和

请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。是数组中的一个连续部分。:接在前一个子数组后面。:单独开始新的子数组。

2025-10-28 17:38:47 168

原创 leetcode-代码随想录-动态规划-1035不相交的线

其实也就是说nums1和nums2的最长公共子序列是[1,4],长度为2。这个公共子序列指的是相对顺序不变(即数字4在字符串nums1中数字1的后面,那么数字4也应该在字符串nums2数字1的后面)绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,只要 nums1[i] == nums2[j],且直线不能相交!这么分析完之后,大家可以发现:本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!以下解析流程和 1143题一样,只是把字符串名字改一下,其他代码一样。

2025-10-28 17:38:11 872

原创 leetcode-代码随想录-动态规划-1143最长公共子序列

是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。1143题(最长公共子序列 - 不连续)是这两个字符串所共同拥有的子序列。,返回这两个字符串的最长。的最长公共子序列长度。:双重循环,都从前往后。

2025-10-28 17:37:28 908

原创 leetcode-代码随想录-动态规划-718最长重复子数组

的代码会比较复杂,所以在这里使用。、长度最长的子数组的长度。的最长公共子数组的长度。:双重循环,都从前往后。

2025-10-28 17:36:47 402

原创 leetcode-代码随想录-动态规划-674最长连续递增序列

给定一个未经排序的整数数组,找到最长且** 连续递增的子序列**,并返回该序列的长度。dp[i]:以下标 i 结尾的最长连续递增子序列的长度;)确定,如果对于每个。就是连续递增子序列。

2025-10-28 17:36:03 307

原创 leetcode-代码随想录-动态规划-300最长递增子序列

*子序列 **是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。子序列性质:元素相对顺序保持不变,但元素可以不连续,需要考虑所有可能的元素组合。由于子序列元素可以不连续,遍历时需要两个指针。,找到其中最长严格递增子序列的长度。结尾的最长递增子序列的长度。各个位置的最长升序子序列。的最长升序子序列等于。

2025-10-28 17:34:47 413

原创 leetcode-代码随想录-动态规划-714买卖股票的最佳时机含手续费

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。**注意:**这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。天不持有股票时的最大利润;(不持有股票状态所得金钱一定比持有股票状态得到的多);推导出来的,那么一定是从前向后遍历。代表了交易股票的手续费用。dp[i-1][1]:是第。返回获得利润的最大值。

2025-10-13 21:09:51 908

原创 leetcode-代码随想录-动态规划-309买卖股票的最佳时机含冷冻期

设计一个算法计算出最大利润。:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。从前向后遍历,因为 dp[i]依赖于 dp[i - 1]。:持有股票状态(状态一)

2025-10-13 21:09:03 866

原创 leetcode-代码随想录-动态规划-188买卖股票的最佳时机Ⅳ

最后一次卖出,一定是利润最大的,dp[prices.size() - 1][2 * k]即红色部分就是最后求解。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。中 i 表示第 i 天,j 为 [0-4]五个状态,dp[i][j]表示第。设计一个算法来计算你所能获取的最大利润。本题可以说是123题的进阶版,要求最多完成。以输入[1,2,3,4,5],k=2为例。推导出来的,那么一定是从前向后遍历。也就是说,你最多可以买。是某支给定的股票在第。

2025-10-13 21:08:13 1417

原创 leetcode-代码随想录-动态规划-123买卖股票的最佳时机Ⅲ

现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。如果想不明白的录友也可以这么理解:如果第一次卖出已经是最大值了,那么我们可以在当天立刻买入再立刻卖出。所以dp[7][4]已经包含了dp[7][2]的情况。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。中 i 表示第 i 天,j 为 [0-4]五个状态,dp[i][j]表示第。最多交易两次,意味着可以买卖一次,可以买卖两次,也可以不买卖。:dp[prices.size()-1][4]就是最终结果。

2025-10-13 21:07:37 1189

原创 leetcode-代码随想录-动态规划-122买卖股票的最佳时机Ⅱ

天不持有股票时的最大利润;(不持有股票状态所得金钱一定比持有股票状态得到的多);在每一天,你可以决定是否购买和/或出售股票。推导出来的,那么一定是从前向后遍历。你也可以先购买,然后在。:dp[5][1]就是最终结果。为什么不是dp[5][0]呢?dp[i-1][1]:是第。

2025-10-13 21:07:02 663

原创 leetcode-代码随想录-动态规划-121买卖股票的最佳时机

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。推导出来的,那么一定是从前向后遍历。:dp[5][1]就是最终结果。为什么不是dp[5][0]呢?买入这只股票,并选择在。

2025-10-13 21:06:32 653

原创 leetcode-代码随想录-动态规划-337打家劫舍Ⅲ

一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回。如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的。最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱。

2025-10-13 21:05:38 777

原创 leetcode-代码随想录-动态规划-213打家劫舍Ⅱ

例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素!对于情况三,取nums[1] 和 nums[3]就是最大的。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,意味着第一个房屋和最后一个房屋是相邻的。那就说明若偷了第一家,就不能偷最后一家;若偷了最后一家,就不能偷第一家。给定一个代表每个房屋存放金额的非负整数数组,计算你。情况二:考虑包含首元素,不包含尾元素。情况三:考虑包含尾元素,不包含首元素。

2025-10-13 21:04:01 364

原创 leetcode-代码随想录-动态规划-198打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,给定一个代表每个房屋存放金额的非负整数数组,计算你** 不触动警报装置的情况下 **,一夜之内能够偷窃到的最高金额。)以内的房屋,最多可以偷窃的金额为。的房屋”并不意味一定要偷第。dp[i]:考虑下标。

2025-10-13 21:03:06 387

原创 leetcode-代码随想录-动态规划-背包总结

问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);:二维dp数组、一维dp数组先遍历背包还是先遍历物品都是可以的,且第二层 for 循环正序遍历(从小到大遍历);:先遍历物品,再遍历背包。

2025-10-13 21:02:19 525

原创 leetcode-代码随想录-动态规划-139单词拆分

如果确定dp[i] 是true,且 [i, j] 这个区间的子串出现在字典里,那么dp[j]一定是true。本题:判断一个非空字符串s是否可以被拆分为一个或多个字典wordDict中的单词。**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。的话,dp[j]为true,表示可以拆分为一个或多个在字典中出现的单词。如果可以利用字典中出现的一个或多个单词拼接出。dp[j] : 字符串长度为。

2025-10-13 21:00:54 536

原创 leetcode-代码随想录-动态规划-279完全平方数

,题目描述中没说要从0开始,dp[0]=0完全是为了递推公式。此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);从递推公式中:每次都是取最小时,所以非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖。dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。dp[j]: 和为 j 的完全平方数的最少数量为 dp[j]的完全平方数的最少数量。

2025-10-13 20:59:30 668

原创 leetcode-代码随想录-动态规划-377组合总和Ⅳ

因为递推公式dp[j] += dp[j - nums[i]]的缘故,dp[0]要初始化为1,这样递归其他dp[j]的时候才会有数值基础。初始化为0,这样才不会影响dp[j]累加所有的dp[j - nums[i]]。dp[j]: 凑成目标正整数为j的排列个数为dp[ji]至于非0下标的dp[j]应该初始为多少呢?题目数据保证答案符合 32 位整数范围。本题实际是求排列总和;

2025-08-06 21:13:19 419

原创 leetcode-代码随想录-动态规划-518零钱兑换Ⅱ

纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行!那么二维数组的最上行 和 最左列一定要初始化,即dp[0][j]和dp[i][0]要初始化。在讲完全背包时,一维dp数组,两个for循环的先后顺序都是可以。也是求装满背包的组合方法数,是01背包。二维DP数组的完全背包的两个for循环先后顺序是无所谓的。装满背包容量为 0 的方法是 1, 即不放任何物品,dp[j]:凑成总金额j的货币组合数为dp[j]先遍历背包,还是先遍历物品都是可以的。

2025-08-06 17:02:10 1067

空空如也

空空如也

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

TA关注的人

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