- 博客(91)
- 资源 (1)
- 收藏
- 关注
原创 LintCode第42题-最大子数组 II-使用前缀和优化 + 动态规划法
描述给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大.每个子数组的数字在数组中的位置应该是连续的.返回最大的和子数组最少包含一个数样例 1:输入:输出:解释:最大的子数组为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2].样例 2:输入:输出:解释:最大的子数组为 [5] 和 [4].挑战要求时间复杂度为 O(n)上一篇提到:动态累加和 + 最大子数组和这一篇使用前缀和优化 + 动态规划思路:通过不重叠以及如何计算
2025-05-19 14:21:30
563
原创 LintCode第42题-最大子数组 II
最大的子数组为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2].前缀和快速计算 左侧最大子数组和 和 右侧最大子数组和,从而找到两个不重叠子数组的最大和。//依次遍历两个左子数组和右子数组 得到其组合的最大值即为最大的返回值。每个子数组的数字在数组中的位置应该是连续的。// 计算最大不重叠子数组和。// 左侧最大子数组和。// 右侧最大子数组和。最大的子数组为 [5] 和 [4].动态累加和 + 最大子数组和。子数组使得它们的和最大。主要分为两种解题方法。
2025-05-12 22:15:38
431
原创 LintCode第4题-丑数 II
/返回的时候要 1 2 3 5才能算是丑数 由于已经把特殊的1包含进去了 所以只需要判断2 3 5即可。//1对应的返回值为0。//更新指针:确保没有重复 注意这里的确保意思为。[1,2,3,4,5,6,8,9,10,....],第9个丑数为10。//第一个丑数是 1。//返回的时候要 1 2 3 5才能算是丑数。确保每次生成的 “下一个丑数” 是 唯一且最小的。//除的时候要是 2 3 5。:表示所有已生成丑数中,下一个乘以。//除的时候要是 2 3 5。
2025-05-11 12:42:23
472
原创 LintCode第807题-回文数II
2.利用左右双指针进行同步检查 如果有不相同的字符则不是回文数 当循环结束后如果都相同则是回文数。1.将n以2进制的求余 得到每一次最低位的二进制数 然后再将其逆序排序 就会得到正确的二进制数。//n起始数字转化为二进制。//左右比较即会问比较。的二进制表示是否为回文数。
2025-05-11 10:42:23
407
原创 LintCode第241题转换字符串到整数(容易版),133题最长单词,771题-二阶阶乘
给一个字符串, 转换为整数。你可以假设这个字符串是一个有效整数的字符串形式, 且范围在32位整数之间 (-231 ~ 231 - 1)。表示不超过这个正整数且与它有相同奇偶性的所有正整数乘积。,返回该数的二阶阶乘。给一个词典,找出其中所有最长的单词。转换字符串到整数(容易版)
2025-05-11 10:38:29
889
原创 LintCode第485题-生成给定大小的数组,第220题-冰雹猜想,第235题-分解质因数
对于任意一个自然数N,如果N是偶数,就把它变成N / 2;数学家们曾提出一个著名的猜想——冰雹猜想。如果N是奇数,就把它变成 3 * N+1。按照这个法则运算下去,最终必然得1。试问,该数通过几轮变换,会变成1呢?给你一个大小size,生成一个元素。将一个整数分解为若干质因数之乘积。你需要从小到大排列质因子。
2025-05-10 21:56:56
346
原创 LintCode第68题-二叉树的前序遍历,第67题-二叉树的后序遍历
它将被序列化为{1,#,2,3}之后进行后序遍历。它将被序列化为{1,2,3}之后进行后序遍历。它将被序列化为{1,#,2,3}前序遍历。给出一棵二叉树,返回其节点值的前序遍历。给出一棵二叉树,返回其节点值的后序遍历。它将被序列化为{1,2,3}前序遍历。
2025-05-10 13:04:01
869
原创 LintCode第366题-斐波那契数列
解题思路1:递归 下面的代码正确但会产生大量不必要的递归和累加,造成代码执行超时。查找斐波纳契数列中第 N 个数。(N 从 1 开始)个斐波那契数不会超过32位带符号整数的表示范围。我们可以只单纯记录n的累加和即。
2025-05-10 12:36:30
240
原创 第423题-有效的括号序列
if(strStack.isEmpty())//出现左括号不够的情况。// 没有匹配的左括号。strStack.isEmpty())//出现只有左括号的情况。// 栈顶必须是左括号。// 右括号检查栈顶。// 使用栈来匹配括号。
2025-05-09 15:43:04
873
原创 LintCode第263题-小括号匹配
/ 没有匹配的左括号。// 栈顶必须是左括号。// 右括号检查栈顶。// 使用栈来匹配括号。, 判定是否是有效的括号序列。//出现只有左括号的情况。出现左括号不够的情况。
2025-05-09 15:41:41
392
原创 LintCode1343-两字符串和,1535-转换成小写字母
该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串.for(int i=1;i<=offSet;i++)//i指的是个数。i<=offSet;i++)//i指的是个数。2.语义明确,简洁:Character.getNumericValue。给定两个仅含数字的字符串,你需要返回一个由各个位之和拼接的字符串。{ //将b追加长度。
2025-05-09 13:08:19
607
原创 LintCode第422题-最后一个单词的长度,491题-回文数,936题-首字母大写
回文数的定义是,将这个数反转之后,得到的数仍然是同一个数.给的数一定保证是32位正整数,但是反转之后的数就未必了。输入一个英文句子,将每个单词的第一个字母改成大写字母。是指仅由字母组成,且不包含空格字符的。// 将第一个字符大写。,请返回其最后一个单词的长度。判断一个正整数是不是回文数。, 包含大小写字母、空格。
2025-05-09 11:23:51
593
原创 LintCode第1334题-旋转数组,146题-大小写转换II,353题-最大字母
给定字符串S,找到一个字母字符,其大写和小写字母均出现在S中,则返回此字母的大写,若存在多个答案,返回最大的字母,不存在则返回"NO".if(currentChar>='a'&¤tChar<='z')//是小写字母。if(currentChar>='A'&¤tChar<='Z')//是大写字母。// 易错点: 因为题目中的k可能会超出整个数组的取值范围 所以要保证 k 在有效范围内。// 易错点:保证 k 在有效范围内。给定一个数组,将数组向右移动k步,其中k为非负数.// 直接遍历字符串,转换并拼接。
2025-05-08 00:41:15
819
原创 LintCode第539题-移动零,767题-翻转数组
j++)//采用直接交换。移动到数组的最后面,非零元素保持原数组的顺序。注意:1.必须在原数组上操作。原地意味着你不能使用额外空间。
2025-05-07 12:38:12
305
原创 LintCode407-加一,LintCode第479题-数组第二大数
/BigInteger.valueOf(任意整数)放在bigIntegerValue.add()方法里里面 表示加上任意一个数。//如果是Integer数组 可以用Arrays.sort(boxed, Comparator.reverseOrder());给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。如果此题使用Integer,那么会造成整数溢出越界问题。该数字按照数位高低进行排列,最高位的数在列表的最前面.//如果为int[]可以可以先进行包装。在数组中找到第二大的数.
2025-05-06 23:47:16
338
原创 LintCode第484题-交换数组两个元素,第9题-Fizz Buzz 问题,第46题-主元素,第50题数组剔除元素后的乘积
j++)//当前j跟随i动态变化 当前轮的起步位置。i++)//每轮是数组的起步位置。定义B[i]=A[0]∗...∗A[i−1]∗A[i+1]∗...∗A[n−1], 计算。给定一个整型数组,找出主元素,它在数组中的出现次数大于数组元素个数的二分之一.//统计哪个map的值超过了列表的一半 哪个就是主元素。//统计当前元素出现的次数。给你一个数组和两个索引,交换下标为这两个索引的数字。数组中1的个数大于数组元素的二分之一。数组中2的个数大于数组元素的二分之一。假设数组非空,且数组中总是存在主元素。
2025-05-06 21:49:36
674
原创 LintCode第25题-打印X,214题-数组的最大值,297题-寻找最大值,298题-寻找素数
不能将float MaxValue=a[0];写为 float MaxValue=Float.MIN_VALUE;因为Float.MIN_VALUE值为最小的正数值 所以不包含小于0的情况。j++) //当前字符串的长度。i++)//当前的层数。, 你需要按样例的方式返回一个字符串列表。给一个浮点数数组,求数组中的最大值。保证 n 是100以内的整数。寻找 n 个数中的最大值.输出n以内所有的素数.
2025-05-06 15:37:16
733
原创 LintCode第766题,LintCode第1141题,LintCode第478题
闰年是包含额外一天的日历年. 如果年份可以。给定年份和月份,返回这个月的天数。以上两个满足其中之一就是闰年。返回 10 - 11的结果。返回 1 + 2 的结果。返回10 * 20的结果。返回 3 / 2的结果。, 那么这一年为闰年。
2025-05-06 00:04:25
519
原创 LintCode第23题-判断数字与字母字符 第145题-大小写转换 第283题-三数之中的最大值
我们还应该掌握常见的char与int类型的转化。直接使用包装类的方法来判断。
2025-05-05 15:00:47
146
原创 LintCode第1300题-巴什博弈
你正在和朋友玩一个游戏:桌子上有一堆石头,每一次你们都会从中拿出1到3个石头。拿走最后一个石头的人赢得游戏。游戏开始时,你是先手。// true 表示我,false 表示对方。// 无法让对方面对4的倍数,只能随便拿1个。举例:有四个石头,那么你永远不会赢得游戏。不管拿几个,最后一个石头一定会被你的朋友拿走。假设两个人都绝对理性,都会做出最优决策。给定石头的数量,判断你是否会赢得比赛。// 谁最后拿走,谁赢。// 当前玩家采取最优策略:让对方面对4的倍数。// 当前玩家可以直接拿完,赢了。
2025-05-05 14:46:33
268
原创 LintCode第764题-计算圆周长和面积
其中数组的第一个元素代表圆的周长,数组的第二个元素代表圆的面积。该题关键是要知道圆的周长计算公式和圆的面积计算公式。你的任务是返回一个数组。
2025-05-05 14:03:59
200
原创 LintCode第37题-反转一个三位整数
/ 将其加到反转结果的末尾。// 去掉 number 的最后一位。// 取出最后一位数字。// 当 number 不为 0 时,持续进行反转操作。// 将数字转为字符串,再转为字符数组。// 转换为整数(会自动忽略前导 0)使用字符串转化,将其次序反转并重新转化为数字。// 从后往前遍历字符数组。// 创建反转后的字符串。反转一个只有3位数的整数。对10求余取出最后一位数字。将其加到反转结果的末尾。
2025-05-05 13:54:43
287
原创 LintCode第652题-递归版
该方法里面是supplementNum而不是startFactor。组合中的元素(a1,a2,...,ak)必须是非降序。(即,a1≤a2≤...≤ak)。一个非负数可以被视为其因数的乘积。编写一个函数来返回整数 n 的因数所有可能组合。1.容易忽略掉回溯语句,回溯后没清除path,会导致组合路径出错。如果是传入的是startFactor会有无线递归的风险。结果集中不能包含重复的组合。
2025-05-01 16:48:34
420
原创 LintCode第192题-通配符匹配
/// 继承上一个状态。// 一旦不是 *,后面都不可能匹配空串了。匹配分为3部分 普通字符匹配?,只是“存在但不参与匹配” 所以选择忽略掉。//如果是p的字符是*的情况下的匹配。//如果是p的字符是?两个串完全匹配才算匹配成功。//如果是普通匹配 那么就是。
2025-04-22 00:05:48
884
原创 LintCode第107题-单词拆分
描述给定字符串s和单词字典dict,判断是否可以利用字典dict中的出现的单词拼接出s,其中字典dict中的单词可以重复使用。因为我们已经使用了更强大的数据,所以普通的DFS方法无法解决此题。输入:输出:true解释:lintcode可以分成lint和code。输入:输出:true解释:a在dict中。思路:我们可以考虑动态规划 因为符合这三个条件s[0...i]s[j...i]常见的错误有:实际上要写上。
2025-04-21 18:26:56
651
原创 LintCode第476题-石子归并V(区间型)
再开始当前题以前需要了解到 贪心算法和动态规划的区别相同点:都要求最优子结构不同点:贪心算法说明的是做出局部最优选择不会影响后续选择或整体最优但是石子归并并不符合贪心算法的要求 因为这个策略在「哈夫曼编码」那类不限顺序合并的场景有效,但本题必须合并相邻石堆限制了合并顺序,这导致贪心不能保证全局最优,即相邻的合并顺序会影响到后续的选择而不像贪心算法一样不会影响后续的旋转举例:输入: [3, 4, 3]
2025-04-15 13:46:47
569
原创 LintCode第76题-最长上升子序列
且该题不为组合问题 因为是找最长子序列 为路径问题 一般路径问题不会进行重复 为什么不会重复呢 因为路径只走一次 即使数组中有重复的数字 但取路径的时候只会将相同的元素取一次。最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。即该题可以这样理解:该题中dp[i]的值是以判断nums[j]的大小来决定路径的长度是否要更新。//取当前的某一个具体的dp[m]最长子序列路径。
2025-04-14 11:55:09
292
原创 LintCode第563题-(0,1)背包问题即不可重复背包问题
即假设dp[3] 即跳到第三阶的组合可以是先dp[1]后dp[2] 或者是先dp[2]后dp[1] 即。├── dp[2] + 2 → 有 2 种跳到 dp[2] 的方式,加一个 2阶。└── dp[1] + 3 → 有 1 种跳到 dp[1] 的方式,加一个 3阶。dp[0] = 1;则dp[3] = dp[2] + dp[1] + dp[0]则dp[4] = dp[3] + dp[2] + dp[1]
2025-04-13 02:57:27
521
原创 LintCode第652题-因式分解(非递归版)
常见的错误是:以12为例当回溯是 2 2 3 回到上一个节点2 此时右子树是6 如果不回到12的根节点 那么遍历的路径就会有缺失即右边的 12 -3 -4缺失。即没有回溯每个分支的状态 即只记录了最大的深度而没有但没有回溯过程 但并没有将每个分叉点的信息(比如:当前除以多少、从哪个数字开始)压栈,从而没法回退。我们在遍历的时候 通常会采取先试着用小的数 然后逐步增大的策略,但这里要注意的是回溯的时候一定最后每轮要回溯到根节点然后再使用比刚才更小的数进行尝试。即较小的因子小于等于较大的因子。
2025-04-12 02:34:46
673
原创 LintCode第127-拓扑排序
3.将队列的节点依次出队 每次出队一个节点 然后记录在结果的数组中 并更新邻接节点的入度。树的层序遍历是BFS的一种具体应用形式,即广度优先搜索在树结构上的特化。拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点.遍历顺序:从起点开始,先遍历“距离近的”,再遍历“距离远的”// 将所有入度为 0 的节点入队。针对给定的有向图找到任意一种拓扑排序的顺序.// 用于记录每个节点的入度。5.最终返回结果的数组 即拓扑排序的结果。// 记录拓扑排序的结果。您只需要返回给定图的任何一种拓扑顺序.
2025-04-07 00:13:02
704
原创 LintCode第974题-求矩阵各节点的最短路径(以0为标准)
然后通过两个变量 path来记录路径的长度 队列来记录为未满足为0的位置索引 每次判断但凡队列的点相邻但凡没有一个符合条件就先让path+1。然后记录所有不符合的点 直至循环出相邻有0的点 因为题目已经告知给定的矩阵至少有一个0。// 当前单元格的路径。// 将所有为0的点入队,作为BFS的起点。给定一个由0和1组成的矩阵,求每个单元格最近的0的距离。
2025-04-04 15:27:07
981
原创 LintCode第902题-BST(二叉搜索树)中第K小的元素
思路:由于为BST树 那么 可以先用一个list来统计出 然后直接取索引为k-1的值即为目标值。优化思路:中序遍历的时候同时计数 即可提前返回(节省空间)函数来找到其中第 K 小的元素。给一棵二叉搜索树,写一个。
2025-04-03 16:12:29
299
原创 LintCode第67题-二叉树的中序遍历(非递归版)
递归用的是 Java 自带的 系统调用栈(call stack) 来 隐式记录节点的访问状态。非递归用的是: 程序员自己创建的 Stack 对象 来 显式记录节点的访问状态。// 3. 处理右子树(开始新的左下压入过程)// 一直往左走,把沿途的节点压入栈。//弹出栈顶元素(中间节点) ,加入结果。因为节点 3 没有被访问 所以不符合中序遍历的要求。在弹出的时候不应该直接弹出节点,而是应该把。它将被序列化为{1,#,2,3}中序遍历。它将被序列化为{1,2,3}中序遍历。3)转向右节点(再左走入栈)
2025-04-03 15:47:38
714
原创 LintCode第95题-验证二叉查找树
但BST(二叉排序树)是整棵左子树的所有值都要 < 当前节点值,整棵右子树所有值都要 > 当前节点值。// 上一个访问的节点。第一个问题:遍历的时候是否可以用先序遍历或者是后序遍历 理论上是可以的 但实际上很麻烦。节点 8 的左孩子是 4,但 4 < 5,这个不合法 这是由于忽略了整个树的结构导致的。第二个问题:为什么中序遍历不需要判断左右两边的大小 只需要当前节点与上一个节点作比较呢。直接判断左子树的节点值小于根节点值 右子树的节点值大于根节点的值。这只能判断 当前节点是否满足和直接子节点的关系。
2025-04-03 01:51:50
750
原创 LintCode第94题-二叉树中的最大路径和
/ 用于记录最大路径的节点。给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)2.当前节点做拐点,同时连接左右子树 + 自己,尝试更新最大路径和 并更新当前的最大路径和。// 当前节点为“拐点”的路径值:左 + 当前 + 右。// 当前节点为“拐点”的路径值:左 + 当前 + 右。// 返回给父节点的最大贡献路径(只能向上走一边)// 返回以当前节点为根的最大单边路径(只能向上传)// 返回以当前节点为根的最大单边路径(只能向上传)
2025-04-02 16:31:40
428
原创 LintCode第1534题-将二叉搜索树转换为已排序的双向链接列表
双向链表中的每个节点都有一个前任和后继。对于循环双向链表,第一个元素的前导是最后一个元素,最后一个元素的后继是第一个元素。2.由于为中序遍历 那么要在递归右子树前就要把前两个节点即当前的节点和前驱节点找到并相互链接,并通过右子树来遍历来判断是否有后续节点.转换后,树节点的左指针应指向其前一个指针,右指针应指向其后继指针。可以将左右指针视为双向链表中上一个和下一个指针的同义词。“head”符号表示它指向的节点是链表的最小元素。//通过中序遍历将其变为按大小顺序递增的循环双向链表。下图显示了转换后的BST。
2025-03-26 16:23:39
570
原创 LintCode 第64题合并排序数组(简单版)
描述合并两个排序的整数数组A和B变成一个新的数组。原地修改数组A把数组B合并到数组A的后面。解释:经过合并新的数组为[1,2,3,4,5]解释:经过合并新的数组为[1,2,3,4,5]思路:题目中要求原地排序,则不能从新建一个数组用来记录A数组和B数组的比值并写入应该采用双指针,从后往前原地合并。
2025-03-24 16:11:20
394
eclipse色彩配置
2015-07-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人