自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode 350. 两个数组的交集 II

【代码】leetcode 350. 两个数组的交集 II。

2023-05-16 10:00:36 238

原创 一刷总结!

前面都还算顺利,走到贪心和动态规划的时候就感觉比较吃力了,就是那种怎样都感觉自己想不出来的。还需要多多练习和多多理解。有了这个监督之后,已经养成了每天要写算法的习惯,,hh不错。希望能继续坚持下去,秋招能有一个好结果。

2023-05-16 08:38:25 232

原创 438. 找到字符串中所有字母异位词 ( 滑动窗口

【代码】438. 找到字符串中所有字母异位词 ( 滑动窗口。

2023-05-15 10:39:35 262

原创 leetcode 49. 字母异位词分组

用的是map,第一个类型是string,表示出现的字符串。第二个类型是vector<string>,表示对应字符串出现的集合。注意:这里第一个类型string,是经过排序的。最后再用一个二维数组,接住map中的 second。时间复杂度是: O(n * k* logk)。这个是看题解的,更很快,没有用到排序。时间复杂度是: O ( N * K)

2023-05-15 09:24:06 211

原创 leetcode 76. 最小覆盖子串 (滑动窗口 + 双指针

滑动窗口的总是思想就是,先加入元素,等到元素满足以后,在移动左边的指针,不断查看是否满足条件,如果不满足,就就继续向右边移动。在不断两个指针不断移动的过程中,保存好找到的最优解。总体的思路是用两个哈希表,一个保存的是所需要的,一个保存的是现在现有的,通过不断对比,决定是否添加或者删除。

2023-05-14 10:00:39 59

原创 leetcode 84.柱状图中最大的矩形

十分类似,解释在注释中。

2023-05-13 09:37:22 50

原创 leetcode 42. 接雨水

20 和 30 取一个最小值,然后 20 - 20 = 0,所以面积也为0。所以加入或者不加入,都是一样的。

2023-05-12 11:58:14 54

原创 leetcode 503.下一个更大元素II

我一开始的想法有误区,我想的是走到了最后一个再重新置回 0。但是这样就很难判断到底什么时候循环结束。这里使用的方法是 1. 循环的长度是两倍的数组长度, 2. 然后对 i 取模。这里的区别是,数组是可以循环查找的,一样,用单调栈来求解。

2023-05-12 10:49:10 53

原创 leetcode 496. 下一个更大元素 I

关键是想到把 数组1 中的元素做映射,然后再遍历数组2 ,从数组2 中寻找。

2023-05-11 20:49:32 55

原创 leetcode 739. 每日温度

因为要寻找的是第一个比之前遍历过的元素更大的,如果当前元素比栈顶大,就弹出栈顶元素,并且更新结果数组。弹出的原因是已经找到比它大的元素了,留在栈中没有作用。由于小的元素都被弹出去了,所以栈是单调增的。栈里面是单调递增的,(由 栈顶 到 栈底 是单调增的。关键就是处理好栈顶元素和当前元素的大小关系。弹出小的元素,最后再将该元素本身加入栈中。如果小于或者等于,就直接加入栈中。如果大于就更新结果数组,然后。

2023-05-11 17:40:23 52

原创 leetcode 33. 搜索旋转排序数组 ( 二分法

当 target > nums[mid] 还是 < nums[mid], 都可能会在两边存在解,所以才要根据边界值来判断。2. 注意不管mid落在哪一个部分,数字都是有序的,所以可以。

2023-05-10 15:35:41 61

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

如果中间值是 2, 比 3 小,说明这个中间值是属于右边的,就去左边寻找,因为数组是有序的,如果去继续往右边找的话,只会找到更大的数。,所以当移动完之后,发现中间值是属于左边的,那么就去右边找,因为右边的值还没经过移动。此时中间值如果为 5 , 比 3 大,就说明这个中间值是属于左边的,这时候就去右边,当中间的值大于等于左边的值,就表示是递增的。

2023-05-10 14:27:55 82

原创 leetcode 516.最长回文子序列

需要考虑 i j 相等的情况。还有遍历顺序是逆序的。

2023-05-10 10:06:06 59

原创 leetcode 647. 回文子串

递推公式中,有 dp[i + 1][j - 1] ,这个是在 dp [ i ][ j ] 的左下方,所以需要从下往上,从左往右遍历,以保证每次推导的都是有依据的值,而不是一开始被初始化的值。全部初始化成 fasle,因为一开始还没开始匹配。值:i 到 j 的字符串中回文字符串的个。下标:i 到 j 的字符串中。1. dp数组的含义。

2023-05-10 09:26:35 48

原创 leetcode 72. 编辑距离

dp[i][j] = min(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1 表示的是删除元素,因为增加元素和删除元素是一样的,具体的原因后面理解深刻了再说,现在还讲不太清楚。dp[i - 1][j - 1] + 1 这个表示的是替换元素,在之前的基础上替换。

2023-05-09 15:48:32 47

原创 leetcode 115. 不同的子序列

这里并没有进行 + 1 的操作,因为字符相等,但所包含的个数并不会 + 1。着重理解dp数组的含义,表示的是 s 含有 t 的个数,这道题还没有理解,等之后有空再回来看。

2023-05-09 11:31:45 71

原创 leetcode 583. 两个字符串的删除操作

1. 用最长公共子序列处理,就是两个字符串的总和,减去两倍的最长公共子序列,得到的差就是最小删除字符的操作。

2023-05-09 11:14:32 107

原创 152. 乘积最大子数组

在每遍历一次的情况下就保留最大值和最小值。

2023-05-08 16:11:38 48

原创 leetcode 392. 判断子序列

值:以 i - 1 和 j - 1 为结尾的字符串的相同子序列长度。我之前的错误想法是:用两个循环嵌套。,其实是两个字符串的指针一致移动。下标:以 i - 1 和 j - 1 为结尾的字符串。和之前一样初始化成 0。1. dp数组的定义。

2023-05-08 11:50:56 45

原创 leetcode 392. 判断子序列

值:以 i - 1 和 j - 1 为结尾的字符串的相同子序列长度。我之前的错误想法是:用两个循环嵌套。,其实是两个字符串的指针一致移动。下标:以 i - 1 和 j - 1 为结尾的字符串。和之前一样初始化成 0。1. dp数组的定义。

2023-05-08 11:11:26 47

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

postfix 对应的下标 是包括本身的后缀积。prefix 对应的下标 是包括本身的前缀积。直接在需要返回的数组上进行操作。这里就不定义多定义两个数组。

2023-05-07 15:47:39 54

原创 leetcode 217. 存在重复元素 ( 排序 + 哈希

时间复杂度: nlogn -----> sort带来的。主要思路就是 用哈希法检查该元素以前是否出现过。空间复杂度: n -----> 开了一个set。时间复杂度: n ------> 遍历带来的。

2023-05-07 10:45:19 64

原创 leetcode 53. 最大子数组和

最后的结果是在 dp 数组中,寻找最大的一个数,而不是最后一个数,因为最大子数组和 不一定包括最后一个 元素。dp[i - 1] + nums[i] : 表示由前面一个推到 i。nums[i] : 从现在 i 开始重新计数。值:包括 i 的子数组的最大和。下标:包括 i 的子数组。1. dp数组的定义。

2023-05-06 11:14:18 73

原创 leetcode 1035. 不相交的线

只是换了一个壳子而已。

2023-05-06 10:59:18 77

原创 leetcode 1143. 最长公共子序列

例如:abcd abe,此时的 c 和 e 不相等,所以就向前比较,ab 与 abe。例如:abcd abe,此时的 c 和 e 不相等,所以就向前比较,abc 与 ab。3. 初始化,因为是从 dp数组的定义是从 i - 1 和 j - 1 进行比较的,所以可以默认初始化。值:以 i - 1 和 j - 1 为结尾的最长公共子序列的长度。下标: 以 i - 1 和 j - 1 为结尾的子序列。i - 1 之后,再与当前的 j 比较。j - 1 之后,再与当前的 i 比较。1. dp 数组的定义。

2023-05-06 10:22:30 310

原创 leetcode 718. 最长重复子数组

i : nums1 以 i - 1 为结尾。j : nums2 以 j - 1 为结尾。值: 分别以上述为结尾的最大重复子数组的长度。使用二维数组的不同维度分别表示 num1 和 num2。也就是由前面一个推到后面一个。1. dp数组的含义。

2023-05-05 15:04:47 71

原创 leetcode 674. 最长连续递增序列

1. 第一个想法是双指针。

2023-05-05 14:37:37 69

原创 leetcode 300.最长递增子序列

也就是说,如果 num[ i ] > nums [ j ],就说明子序列的个数要 + 1, 所以 dp[j] + 1。在所有的比较中,dp [ i ] 取最大值,因为 i 在 j 循环的时候, i 是固定的 ,所以就会出现当,j 不。值: 表示包括 i 之前的最大的递增子序列。断移动的时候, dp [ i ] 会出现改变,所以要求的是最大值。下标:第 i 个数字。因为是根据前一个推导出后一个的。一开始都初始化成 1。

2023-05-05 12:09:54 178

原创 leetcode 714.买卖股票的最佳时机含手续费

卖出的时候减去了手续费。

2023-05-04 10:32:54 76

原创 leetcode 309.最佳买卖股票时机含冷冻期

这里将 “ 当天卖出” 单独拿出来,是因为本题存在冷冻期,而冷冻期的前一天是当天卖出的状态。如果不单独拿出来的话,那么冷冻期的前一天就是 不持有股票的状态,不持有股票有两种状态,这里就无法做出准确的区分了。

2023-05-04 09:53:56 78

原创 leetcode 188.买卖股票的最佳时机IV

其实个人觉得和 买卖股票的最佳时机III,是一样的,就是多用下标来表示状态即可。这里两个关于 j 的循环起始位置不一样,这和循环中的内容有关。找出规律就可以用循环来解决啦~j 的循环 是两个两个跳的。

2023-05-03 14:32:08 84

原创 leetcode 123.买卖股票的最佳时机III

因为最后一定是不持有股票的利润最大,而第二次不持有会包含第一次不持有的状态(也就是第一次不持有后,在同一天买入并卖出,这时候第二次不持有和第一次不持有的利润是一样的,2. 因为遍历数组是有先后顺序的,在递推公式中也有买卖的先后顺序,所以不用管可能会连续买入两次的情况,因为递推公式里面的推导不会导致这种情况的发生。一开始被 至多 买卖两次给唬住,想的是用一个变量表示买卖的次数;i 表示天数 , 1 2 3 4表示对应的状态。有四个下标表示两次的状态 (持有 / 不持有。如果还是不理解就取最大值。

2023-05-03 14:05:02 84

原创 leetcode 122.买卖股票的最佳时机II (动规

因为不止可以买入一次,所以是在之前未持有的股票的基础上,所拥有的利润买的。第 i 天买的:dp[i - 1][1] - prices[i]第 i 天之前买的:dp[i - 1][0]跟 买卖股票的最佳时机I 的区别在于。

2023-05-02 16:38:45 60

原创 leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针

(这里没有使用买入、卖出作为含义是因为:单纯的买入,卖出,无法表示出更确切的状态。现在觉得做动规的关键点就是找出,当前的状态是否与之前的状态有关,也就是说:当前一般会有两种状态,具体哪一种为最优,需要依靠之前的状态及逆行推导。dp [ i ] [ 1 ] 表示第 i 天不持有股票, 值为:所获得的利润。第 i 天卖出: dp [ i - 1][ 0 ] + price[ i ]dp [ i ] [ 0 ] 表示第 i 天持有股票,值为:所获得的利润。第 i 天之前就买入了:dp[ i - 1][ 0 ]

2023-05-02 16:21:51 1055

原创 leetcode 337.打家劫舍III

不偷:max(left[0], left[1]) + max(right[0], right[1])、在二叉树中,可以使用后序遍历,先遍历两个子节点,再到根结点,根结点根据子节点是否偷,再决定当前结点。表示根结点不偷取,两个子节点选取金币数最大的状态( 0 或 1 )写一个递归函数,返回值为 一维数组,对应的就是当前结点偷和不偷,所对应的金币数。所以这里的每个结点有两个状态 偷(1 还是 不偷(0,对应一个一维数组。偷:root->val + left[0] + right[0]

2023-05-01 20:07:46 112

原创 leetcode 打家劫舍II

做出来了,但是没想到封装成一个函数,造成了代码的冗余。

2023-05-01 17:10:05 74

原创 leetcode 198.打家劫舍

dp[i - 2] + nums[i] : 当前房子偷,最大金币数来源于前 i - 2 个房子,和当前的房子,前一个房子不能被偷,因为不能偷相邻的。如上所述 dp[i] = max(dp[i - 1] , dp[i - 2] + nums[i]);讨论大小为 1 的原因是:之后的都是根据1 来推的,如果数组大小只有1 的话,就没有往下继续推的必要了。dp[i - 1] : 当前房子不偷,所以最大的金币数都来源于前 i - 1个房子,包括第 i - 1 个。值:这些房子所得到的最大金币数。

2023-05-01 16:35:17 932

原创 leetcode 139.单词拆分

将字符串当作是背包,字符串数组里面的元素当作物品,本题求的是,物品能否将背包装满。为了后面递推公式的计算这里初始化 dp [ 0 ] = true。因为这里不同的顺序意味着不同的字符串,所以对顺序是由要求的。{ap} {pa} 不能看作是同一个字符串。先 背包 后 物品 ,求的是排列数。1. dp 数组的含义。

2023-04-29 16:38:35 79

原创 279.完全平方数

本题和零钱兑换 1 十分类似 ,只是物品变了,物品变成了 i * i。

2023-04-28 18:00:11 65

原创 322. 零钱兑换 ( 完全背包

这里 + 1 表示放入了 i ,所以个数 + 1。和之前加价值不一样,因为dp数组的含义变了。凑到 0 ,不需要硬币,所以数量也为 0 ( 这里和之前也不一样。因为求的的硬币的个数,而不是方案的数量,所以嵌套的前后也不会影响。放入 i :dp[j - coins[i]] + 1。由于是完全背包, 所以都是顺序遍历。不放入 i :dp[j]下标:需要凑到的钱总和。值:最小需要多少个硬币。1. dp数组的含义。

2023-04-28 17:41:28 104

空空如也

空空如也

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

TA关注的人

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