自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Hot100-排序

1.快排(1)第k大的元素在排序数组中的位置是。假设我们有一个数组,并且我们想找到第2大的元素。

2024-07-10 10:23:29 198

原创 Hot100-回溯

有递归就会有回溯,递归和回溯相辅相成,回溯通常藏在递归函数的下面。回溯函数其实就是递归函数,没有单独的回溯函数。

2024-06-18 10:41:10 369

原创 Hot100-动态规划

是由前一个状态推导出来的(时序),而贪心是局部直接选最优的。

2024-06-13 10:07:40 136

原创 Hot100——二叉树

【代码】Hot100——二叉树。

2024-06-05 16:41:44 203

原创 Hot100-链表

请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。中(从头节点开始)跳到交叉节点的节点数。

2024-05-27 17:12:12 944

原创 Hot100-栈

Java中虽然没有专门的Stack类,但可以使用Deque接口及其实现类如LinkedList或ArrayDeque来实现栈的功能。Deque接口提供了非常灵活且高效的栈操作,因此在实际应用中更为推荐。双端队列(Deque)确实可以实现栈的功能,尽管栈是“先入后出”(LIFO,Last In, First Out),而队列是“先入先出”(FIFO,First In, First Out)。

2024-05-23 19:21:41 296

原创 Hot100-普通数组(Kadane算法)

只需要和result中的最后一个区间比较即可(result中存储的都是合并好的区间,由于intervals是按左边界升序排的,只需要判断result中最后一个区间的右边届是否小于当前的左边界)在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。同时,你不能在买入前卖出股票。这类问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大(数组含有负数)。返回你可以从这笔交易中获取的最大利润。设计一个算法来计算你所能获取的最大利润。

2024-05-20 17:02:04 944

原创 Hot100子串

子数组是数组中元素的连续非空序列。暴力搜索时间复杂度O(n*2)

2024-05-19 19:27:06 304

原创 Hot100-滑动窗口

因为字符串 p 的异位词的长度一定与字符串 p的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p的长度相同的滑动窗口,1.若S的长度小于P的长度,不能返回null,应该直接返回一个空数组,因为这个方法要求返回值是List每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。判断的是两个数组是否是同一个数组对象,而不是它们的内容是否相同。比较的是两个数组对象的内存地址,而不是它们的内容。指由相同字母重排列形成的字符串(包括相同的字符串)。

2024-05-16 16:50:02 873

原创 Hot100-双指针

【代码】Hot100-双指针。

2024-05-16 15:53:00 158

原创 Hot100-哈希法

本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。将返回一个包含字符 ‘H’, ‘e’, ‘l’, ‘l’, ‘o’ 的字符数组。1.int是基本属性,所以直接用nums.length,不用调用方法()因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,map.put(nums[i], i):将键值对存入map。

2024-04-28 15:29:02 757

原创 9.16单词拆分(LC139-M)

"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都是false了。dp[i]:i为字符串的长度(装满背包的容量);

2024-03-19 17:24:22 406

原创 9.15完全平方数

j。

2024-03-12 21:04:15 523

原创 9.14零钱兑换(LC322-M)

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。

2024-03-11 11:59:13 1008

原创 9.13组合总和④

本题题目描述说是求组合,但又说是可以元素相同顺序不同的组合算两个组合,。

2024-03-11 10:49:15 290

原创 9.12零钱兑换(LC518-M)(开始完全背包,与01背包的不同仅在于遍历顺序)

这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。但本题和纯完全背包不一样,

2024-03-06 22:27:09 978

原创 9.11一和零(LC474-M)

理解成多重背包的同学主要是把m和n混淆为物品了,感觉这是不同数量的物品,所以以为是多重背包。只不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。装满重量为m(m个0)和重量为n(n个1),两个维度的背包,最多能装多少物品。

2024-03-06 20:38:53 331

原创 9.10目标和(LC494-M)

加法的绝对值的集合left减法的绝对值的集合rightnums集合的总和sum这里的left和right都是绝对值:→ left = (target + sum)/2 ,target 和sum都是常量若target + sum为奇数,则无法整除,其实实际意义就是,没有组合能够得到目标和target。

2024-03-04 17:02:13 559

原创 9.9最后一块石头的重量②(LC1049-M)

视为注释,而不是有效的代码。因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”01背包中:dp[j]的含义-容量为j的背包,最多可以装的价值为 dp[j]。本题物品的重量为stones[i],物品的价值也为stones[i]。

2024-03-03 11:49:27 881

原创 9.8分割等和子集(LC416-M)

dp。

2024-03-03 11:21:38 902

原创 背包问题(理论)

对于面试的话,掌握,就够用了,最多可以再来一个。至于背包九讲其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。leetcode上没有纯01背包的问题,都是01背包应用方面的题目,也就是需要转化为01背包问题。

2024-02-12 19:59:22 287

原创 9.7不同的二叉搜索树(LC96-M)

dp[j]为j为头结点左子树节点数量,dp[i - j-1]为以j为头结点右子树节点数量。dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。

2024-02-09 10:19:23 1213

原创 9.6整数拆分(LC343-M)

dp[i]:分拆数字i,可以得到的最大乘积为dp[i]

2024-02-08 09:23:33 322

原创 9.5不同路径②(LC63-M)

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。这意味着即使在第一列中遇到了障碍物,仍然会继续向下遍历,继续赋值。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2024-02-05 09:38:04 1133

原创 9.4不同路径(LC62-M)

dp是二维数组→网格dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2024-02-05 08:50:45 281

原创 9.3使用最小花费爬楼梯(LC746-E)

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。调到dp[i],不仅需要体力花费(dp[i - 1]或dp[i - 2] 跳1/2阶),还需要金钱花费(cost[i - 1]或 cost[i - 2])也就是说:dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?一定是选最小的,所以dp[i]

2024-02-05 08:06:44 347

原创 9.2爬楼梯(LC70-E)

多举几个例子,找规律:爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。那么所以。

2024-02-02 11:19:02 400

原创 9.1斐波那契数(LC509-E)

一定要写在dp[1] = 1之前;否则当n=0时,就会在dp[1]处报错。dp[i]是依赖 dp[i - 1] 和 dp[i - 2]dp[i]的定义为:第i个数的斐波那契数值是dp[i]那么遍历的顺序一定是从前到后遍历的。

2024-02-02 10:57:04 217

原创 动态规划基础

是由前一个状态推导出来的(时序),而贪心是局部直接选最优的。

2024-02-02 10:36:57 310

原创 8.16单调递增的数字(LC738-M)

拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。此时是从前向后遍历还是从后向前遍历呢?举个例子,数字:332:若从前向后遍历:那么就变成了329,此时2又小于了第一位的3了,真正的结果应该是299。若从后向前遍历:332的数值变化为:332 -> 329 -> 299。

2024-01-27 10:07:48 299

原创 8.15合并区间(LC56)

如果我们在循环内部添加,那么当循环结束时,最后一个合并的区间将被忽略。

2024-01-27 09:30:58 518

原创 8.14划分字母区间(LC763-M)(附.length,.length(),.size()使用原理)

在遍历的过程中相当于是要找每一个字母的边界,。此时前面出现过所有字母,最远也就到这个边界了。

2024-01-27 08:42:20 359

原创 8.13无重叠区间(LC435-M)

此时问题就变成:求非交叉区间的最大个数。区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,

2024-01-26 11:16:38 439

原创 8.12用最少数量的箭引爆气球(LC452-M)

可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例。java所使用的内置函数用的是快速排序需要 logn 的空间。局部最优:当气球出现重叠,一起射,所用弓箭最少。是比较这两个元素的第一个值的大小。排序需要 O(nlogn) 的复杂度。方法默认是按照升序进行排序的。分别代表数组中的两个元素,个元素的第一个值,而。Lambda 表达式。按照数组中每个元素的。

2024-01-26 10:47:15 408

原创 8.11根据身高重建队列(LC406-M)

a和b代表了people数组中的两个元素,每个元素都是一个一维数组,表示一个人的身高和前面的人数。a[0]表示第一个人的身高,a[1]表示第一个人的前面人数。b[0]表示第二个人的身高,b[1]表示第二个人的前面人数。因此,中的比较逻辑根据这些元素的身高和前面的人数进行排序。如果a和b的身高相同(),则表示根据前面的人数升序排列。( a - b 是升序)如果a和b的身高不同,则表示根据身高降序排列。( b - a 是降序)

2024-01-26 09:35:30 1313

原创 8.10柠檬水找零(LC860-E)

只需要维护三种金额的数量,5,10和20。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。账单是20的情况,为什么要优先消耗一个10和一个5呢?遇到账单20,优先消耗美元10,完成本次找零。完成全部账单的找零。

2024-01-26 08:30:09 229

原创 8.9分发糖果(LC135-H)

这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,。

2024-01-25 12:08:11 361

原创 8.8加油站(LC134-M)

首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,每个加油站的剩余量rest[i]为gas[i] - cost[i]。说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。。

2024-01-25 10:54:48 379

原创 8.7K次取反后最大化的数组和(LC1005-E)

局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了)这意味着,元素的绝对值较大的会排在前面。1.这段代码使用了Java中的流式操作(Stream API)来对整数数组进行一系列操作。若k为偶数,正确的算法会反复取反同一个数 偶数次,相当于没有取反,所以无需再操作。局部最优:让绝对值大的负数变为正数,当前数值达到最大。对象,这是Java中用于表示一系列整数的流。中的每个元素都装箱为对应的包装类型。

2024-01-25 09:39:57 441

原创 8.6跳跃游戏②(LC45-M)

与上一题一样,还是看覆盖范围以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

2024-01-25 08:49:16 515

空空如也

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

TA关注的人

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