- 博客(91)
- 收藏
- 关注
原创 验证二叉搜索树
要判断一个二叉树是否是有效的二叉搜索树(BST),我们需要确保每个节点都满足BST的定义:节点的左子树只包含小于当前节点的数,节点的右子树只包含大于当前节点的数,并且所有左子树和右子树自身也必须是BST。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。递归是解决这个问题的有效方法。
2024-11-07 19:55:59
563
原创 求根节点到叶子节点的数字之和
给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123。计算从根节点到叶节点生成的 所有数字之和。叶节点 是指没有子节点的节点。给定一个二叉树,每个节点都包含一个 0 到 9 之间的数字。每条从根节点到叶节点的路径代表一个数字,路径上的数字依次排列形成的数字即为该路径所代表的数字。为当前路径所代表的数字(将当前节点的值加到。如果当前节点是叶节点,返回。
2024-11-03 20:20:15
463
原创 深度优先搜索 - 岛屿最大面积
对于当前陆地元素,我们首先将其标记为已访问,并增加岛屿面积的计数器。但是,在调用之前,我们需要检查相邻元素是否在网格范围内内,并且它们是否是陆地(值为1)。:从当前陆地元素开始,递归地访问所有相邻的陆地元素,并将它们标记为已访问(例如,将它们的值从1更改为0或其他标记值)。:DFS的递归基准条件是当我们尝试访问一个不在网格范围内的元素、一个已经访问过的元素(即值为0或其他标记值),或者当我们达到网格的边界时。:对于每个元素,如果它是陆地(值为1),则意味着我们可能找到了一座岛屿的一部分。
2024-10-11 21:56:13
701
原创 深度优先搜索 - 岛屿问题
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。在搜索过程中,它将访问过的格子标记为已访问(例如,将其值从'1'更改为'0'),以确保我们不会再次访问它们。为了计算完整的岛屿数量,我们需要确保我们不会重复计算同一座岛屿的不同部分。在这个问题中,岛屿是由四面相连的'1'(陆地)形成的区域,并且这些区域完全被'0'(水)包围。每次我们从一个未访问的陆地格子开始DFS搜索时,我们都知道我们找到了一座新的岛屿。最后,我们输出岛屿计数器的值,即网格中岛屿的数量。
2024-10-11 21:55:36
684
原创 动态规划-01背包问题
01背包问题是一种经典的动态规划问题。问题描述为:给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,如何选择物品装入背包,使得背包中的物品总价值最大。每种物品只能选择装入或不装入背包一次(即0或1次),这就是“01”的含义。
2024-09-21 16:06:21
1105
1
原创 动态规划-不同的子序列
题目描述给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 + 7 取模。示例:输入:s = "babgbag", t = "bag"输出:5解释:如下所示, 有 5 种可以从 s 中得到 "bag" 的方案。babgbagbabgbagbabgbagbabgbagbabgbag为了解决这个问题,我们首先需要理解题目中的关键概念:“子序列”和“出现的个数”。
2024-09-14 20:36:32
417
2
原创 动态规划-最长回文子串
首先,我们需要定义DP数组dp,其中dp[i][j]表示字符串s中从索引i到索引j的子串(即s[i--j])是否是回文子串。注意,这里i和j都是基于0的索引。
2024-09-08 16:11:57
796
原创 动态规划-最长定差子序列
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference。是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。示例 :输入:arr = [1,5,7,8,5,3,4,2,1,0], difference = -2输出:4解释:最长的等差子序列是 [7,5,3,1]。
2024-09-06 15:13:22
756
1
原创 动态规划-最长递增子序列
首先,我们需要明确状态的定义。在这个问题中,我们定义dp[i]为以nums[i]结尾的最长递增子序列的长度。这个定义很关键,因为它允许我们仅通过查看数组的前缀(即nums[0]到nums[i-1])来找出以nums[i]结尾的最长递增子序列的长度。
2024-09-05 15:30:16
521
1
原创 动态规划-乘积为正数的最长子数组长度
首先,我们需要定义状态来表示问题的子问题。在这个问题中,我们关心的是以某个元素结尾的子数组的最长乘积为正数的长度。但是,由于乘积可能涉及正负数的相乘,我们还需要额外跟踪以某个元素结尾的子数组的最长乘积为负数的长度。pos[i]:以nums[i]结尾的最长乘积为正数的子数组的长度。neg[i]:以nums[i]结尾的最长乘积为负数的子数组的长度。注意,我们并不直接定义一个状态来表示“最长乘积为正数的子数组的长度”,因为那样会很难处理跨越多个元素的乘积变化(特别是涉及到负数时)。
2024-09-05 13:54:04
528
原创 动态规划-乘积最大子数组
与最大乘积类似,最小乘积的更新也考虑了当前元素、前一个位置的最小乘积乘以当前元素,以及前一个位置的最大乘积乘以当前元素(当当前元素为负数时)。这是因为,负数乘以正数(前一个位置的最大乘积)会得到一个更小的负数,这可能是新的最小乘积。给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续 子数组 (该子数组中至少包含一个数字),并返回该子数组所对应的乘积。本身(如果前面的元素都是负数或者乘积小于当前元素),要么是前面位置的最大乘积。数组中的最大值即为所求的最大乘积子数组的乘积。
2024-09-03 16:32:47
568
2
原创 动态规划-最大子数组和
我们定义一个数组dp,其中dp[i]表示以nums[i]结尾的连续子数组的最大和。注意,这里的定义稍微有些不同,因为我们实际上并不需要显式地存储整个dp数组(尽管在某些情况下这样做可以方便调试和理解),而是可以通过变量来维护当前的最大和(即dp数组中的最后一个有效值)以及全局的最大和。
2024-09-03 16:32:08
1054
1
原创 动态规划-买卖股票的最佳时机Ⅳ
在这个解决方案中,我们使用了两个二维数组f和g来跟踪每一天和每一次交易后的最大利润。f[i][j]:表示第i天结束后,进行了j次交易(注意这里的j次交易包括买入和卖出),并且当前手中持有股票时的最大利润。g[i][j]:表示第i天结束后,进行了j次交易,并且当前手中没有股票时的最大利润。
2024-08-31 23:01:45
1094
1
原创 动态规划-买卖股票的最佳时机含手续费
此前也讲解过买卖股票的最佳时机系列的其他问题,可以阅读贪心算法_Yuan_Source的博客-CSDN博客。
2024-08-28 14:11:19
559
2
原创 动态规划-买卖股票的最佳时机含冷冻期
本篇包括买卖股票的最佳时机含手续费以及买卖股票的最佳时机含冷冻期两题。此前也讲解过买卖股票的最佳时机系列的其他问题,可以阅读贪心算法_Yuan_Source的博客-CSDN博客。
2024-08-28 14:09:14
922
1
原创 动态规划-删除并获取点数
接下来,定义一个长度为n+1的数组dp,其中dp[i]表示在考虑前i个数字(即数字1到i)时,通过删除操作可以获得的最大点数。注意这里的“前i个数字”是指arr数组中索引为0到i的元素,它们实际上对应了原数组nums中的数字1到i(如果它们存在的话)。
2024-08-26 10:00:10
383
1
原创 动态规划-粉刷房子
动态规划(Dynamic Programming, DP)是一种通过将原问题分解为相对简单的子问题的方式求解复杂问题的方法。这些子问题通常是原问题的较小实例,并且它们的解被保存起来以便后续使用,从而避免了重复计算。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其。
2024-08-26 08:55:20
605
原创 动态规划-打家劫舍
dp[i]:到位置i时(包括位置i),可以抢到的最多钱。这个数组在最终答案的求解中并不是直接必要的,因为最终答案可以通过遍历f或g数组得到,但在这里它被用作一个中间变量来存储每个位置的最大收益。f[i]:在位置i选择抢时,到位置i可以抢到的最多钱。这表示如果小偷决定抢第i个房子,那么他应该抢到的最大金额。g[i]:在位置i不抢时,到位置i可以抢到的最多钱。这表示如果小偷决定不抢第i个房子,那么他应该抢到的最大金额。
2024-08-24 09:03:04
1224
1
原创 动态规划-路径问题(最小路径和+珠宝的最高价值)
然而,需要注意的是,这些额外的行和列通常被初始化为一个足够大的值以确保它们不会被选择为到达网格中某个点的最优路径的一部分。这个题目是一个典型的动态规划(Dynamic Programming, DP)问题,它涉及到在给定网格中寻找一条从左上角到右下角的路径,使得路径上经过的数字总和最小。给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小,每次只能向下或者向右移动一步。:在DP表的第一行和第一列(实际上是索引为0的行和列)上,除了左上角的。
2024-08-22 15:32:59
708
原创 动态规划-下降路径最小和
下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置(row, col)的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1)。动态规划通常用于解决那些可以通过将原问题分解为较小子问题,然后解决这些子问题来解决整个问题的情况。在这个问题中,我们可以从最后一行开始向上回溯,计算到达每一行每一列的最小路径和。
2024-08-20 17:28:37
470
1
原创 二分查找-69.x的平方根
为了计算非负整数x的算术平方根的整数部分,我们可以采用二分查找法。考虑到平方根的性质,我们可以设定一个查找范围从0到x(因为x的平方根肯定小于或等于x),并在这个范围内进行二分查找。的算术平方根的整数部分,如果不使用任何内置的指数函数或算符,我们可以采用暴力解法(也称为直接法或枚举法)。给你一个非负整数 x ,计算并返回 x 的 算术平方根。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5。
2024-08-20 16:31:42
1055
1
原创 二分查找-34.在排序数组中查找元素的第一个和最后一个位置
因为倘若在只剩下两个元素后,前一种方法取得的mid 是left,后一种方法取得的是right,如果取得right,在nums[mid] >= target 的情况下,right = mid,将会出现死循环。left + (right - left + 1 ) /2 ,而非 left + (right - left ) / 2 ,原因与上相近。输入:nums = [5,7,7,8,8,8,9,10], target = 8。left = right 时就是最终结果,无需再继续判断,否则会进入死循环。
2024-08-18 17:09:36
420
1
原创 动态规划-91.解码方法
例如,"11106" 可以映射为: "AAJF" ,将消息分组为 (1, 1, 10, 6) "KJF" ,将消息分组为 (11, 10, 6) 消息不能分组为 (1, 11, 06) ,因为 "06" 不是一个合法编码(只有 "6" 是合法的)。给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数。如果没有合法的方式解码整个字符串,返回 0。然而,在 解码 已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中("2" 和 "5" 与 "25")。
2024-08-18 15:40:25
412
1
原创 二分查找算法-704.二分查找
二分查找算法(Binary Search Algorithm)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到元素。二分查找算法的时间复杂度为O(log n),其中n是数组的长度。这使得二分查找算法比线性查找(时间复杂度为O(n))快得多,特别是当数据量很大时。
2024-08-14 09:56:22
582
2
原创 C++类型转换
在C语言中,如果。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败显式类型转化:需要用户自己处理C++中类型转换是一个重要的概念,它允许开发者在不同类型之间转换数据。C++提供了几种不同类型的转换方式,每种方式都有其特定的用途和规则。
2024-08-10 19:39:28
464
3
原创 动态规划-斐波那契数列
动态规划是一种强大的算法设计技术,特别适用于那些具有重叠子问题和最优子结构特征的问题。通过合理定义状态、建立状态转移方程、初始化边界条件以及确定计算顺序,可以有效地解决复杂的最优化问题。
2024-08-10 19:33:56
706
2
原创 Linux项目自动化构建工具-Makefile简介
Makefile 是 Linux 环境下常用的一个自动化构建工具,它主要用于编译和构建项目。Makefile 文件描述了如何编译和链接程序,以及它们之间的依赖关系。使用 Makefile 可以简化编译过程,使得只需要重新编译那些自上次编译以来被修改过的文件,从而节省时间。
2024-08-08 14:59:04
817
3
原创 柠檬水找零-贪心算法
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
2024-08-08 14:58:43
430
1
原创 C++异常概念简介
抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象, 所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。二、函数是否抛异常、抛什么异常,都。返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那。异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。标准库的异常体系定义得不好,导致大家各自定义各自的异常体系,非常的混乱。
2024-08-06 19:40:15
1034
2
原创 C++内存泄漏介绍
C++内存泄漏(Memory Leak)是指程序在运行过程中,动态分配的内存没有被适当地释放或回收,导致这部分内存始终被占用,无法再被程序或其他程序使用。这种情况通常发生在使用了new或malloc等函数动态分配内存后,忘记了对应的delete或free调用,或者是因为逻辑错误导致这些调用未能执行。C/C++程序中一般我们关心两种方面的内存泄漏:堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一。
2024-08-06 19:39:42
428
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人