- 博客(158)
- 收藏
- 关注
原创 一刷总结!
前面都还算顺利,走到贪心和动态规划的时候就感觉比较吃力了,就是那种怎样都感觉自己想不出来的。还需要多多练习和多多理解。有了这个监督之后,已经养成了每天要写算法的习惯,,hh不错。希望能继续坚持下去,秋招能有一个好结果。
2023-05-16 08:38:25 232
原创 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 503.下一个更大元素II
我一开始的想法有误区,我想的是走到了最后一个再重新置回 0。但是这样就很难判断到底什么时候循环结束。这里使用的方法是 1. 循环的长度是两倍的数组长度, 2. 然后对 i 取模。这里的区别是,数组是可以循环查找的,一样,用单调栈来求解。
2023-05-12 10:49:10 53
原创 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 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
原创 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 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 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 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 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
原创 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关注的人