自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划day.2

题目描述:一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?283从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下2862 * 109思路代码。

2024-05-08 15:33:53 877

原创 动态规划day.1

(通常用F(n)表示)形成的序列称为。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n,请计算F(n)。n = 21n = 32思路:确定dp数组(dp table)以及下标的含义,dp是一个一维或者二维的用来做状态转移的数组,dp[i]代表着第i个斐波那契数值为dp[i]确定递推公式dp数组如何初始化,根据题目描述进行初始化,dp[0] = 1 , dp[1] = 1确定遍历顺序。

2024-05-08 10:46:54 1006

原创 贪心算法day.6

题目描述:当且仅当每个相邻位数上的数字x和y满足x <= y时,我们称这个整数是的。给定一个整数n,返回小于或等于n的最大数字,且数字呈。

2024-04-24 18:53:46 430

原创 贪心算法练习day.5

题目描述:给定一个区间的集合intervals,其中。返回需要移除区间的最小数量,使剩余区间互不重叠。1移除 [1,3] 后,剩下的区间没有重叠。2你需要移除两个 [1,2] 来使剩下的区间没有重叠。0你不需要移除任何区间,因为它们已经是无重叠的了。先对区间进行排序,让区间尽可能的重叠,这就是局部最优,当发现区间不重叠时什么也不做,当发现区间重叠时,更新重叠区间的最小右区间,并且记录要删除的区间,为了下一次的区间比较,看看是否有联系重叠的情况。

2024-04-24 17:23:31 1037

原创 贪心算法练习day.4

题目描述:在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。注意,一开始你手头没有任何零钱。给你一个整数数组bills,其中bills[i]是第i位顾客付的账。如果你能给每位顾客正确找零,返回true,否则返回false。true前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。

2024-04-24 15:37:04 528

原创 C++智能指针

智能指针是行为类似于指针的类对象,但是这种对象还有其他的功能,那么我们为什么要使用智能指针呢?我们可以通过一个例子来看看。

2024-04-24 10:04:48 544

原创 贪心算法练习day.3

题目描述:给你一个整数数组nums和一个整数kinums[i]-nums[i]重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数组。5选择下标 1 ,nums 变为 [4,-2,3]。6选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2]。13选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。

2024-04-23 18:49:15 873

原创 贪心算法练习day.2

题目描述:给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候只能持有股票。你也可以先购买,然后在出售。返回你能获得的利润。7在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。

2024-04-23 15:33:49 669 1

原创 贪心算法练习day.1

贪心算法是一种常见的解决优化问题的方法,其基本思想就是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部的最优决策,以此得到全局的最优解,例如在十张面额不同的钞票,让我们去取5张,那如何拿到最多的钱呢?那我们每次取钞票时只需要取出面额最大的一张(局部最优),最后拿到的就是最多的钱(全局最优),这就是贪心的策略贪心算法优点和局限性:优点:操作直接,实现简单,效率高局限性:有时候并不能找到最优解,即无法保证能找到最优解,可能找到较差的解贪心算法主要适用于以下两种情况。

2024-04-23 14:05:24 1696 1

原创 C++异常

程序有时候会在运行阶段出现错误,导致程序无法正常继续运行下去,例如,程序会试图打开应该不可用的文件,请求过大的内存等等,通常,我们都需要预防这种情况的发生,C++异常为处理这种情况提供了一种功能强大且灵活的工具,异常是相对较新的C++功能,可能有些老的编译器会不支持这种功能我们通过一个例子来看看一些不使用异常的方法,例如我们编写一个计算两个数的调和平均数,两个数的调和平均数是两个数倒数的平均值的倒数,因此表达式为2.0 * x*y / (x + y),因此。

2024-04-23 08:54:16 1038

原创 C++友元类

假设我们技术的进步,不光能通过遥控器控制电视机,电视机也是反馈信息给我们的遥控器,让它们成为一种交互式的器件,这样我们就可以通过C++的编程,也就是可以通过让类彼此成为对方的友元来实现这个功能,即不光Remote是Tv类的友元,Tv类也是Remote类的友元,对于这样的情况,我们需要使用Remote对象的Tv方法,就需要将Tv类的原型放在Remote类的声明之前,并且将Tv类的定义放在Remote类声明之后,让编译器能够有足够的信息去编译这个方法,即如下所示。成功的修改了电视机类的私有成员。

2024-04-22 14:31:54 1000

原创 回溯算法练习day.6

题目描述:按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。n = 4如上图所示,4 皇后问题存在两个不同的解法。n = 1[["Q"]]思路:使用回溯算法来遍历出所有的结果,首先抽象为树形结构,以n为3为例。

2024-04-22 10:13:25 1015

原创 回溯算法练习day.5

题目描述:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。[[4,4]]因为是求组合问题,因此使用回溯算法,就可以抽象出树形结构,如下所示。

2024-04-21 20:00:30 802

原创 回溯算法练习day.4

正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s,用以表示一个 IP 地址,返回所有可能的,这些地址可以通过在s中插入'.'来形成。你重新排序或删除s中的任何数字。你可以按顺序返回答案。s = "0000"思路:因为是分割问题,因此可以使用回溯算法解决,我们可以将其抽象为一个树形结构。

2024-04-21 16:59:13 1124

原创 回溯算法练习day.3

题目描述:给你一个的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的 所有,并以列表形式返回。你可以按返回这些组合。candidates中的数字可以。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为target的不同组合数少于150个。[2,3,6,7],target =72 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。7 也是一个候选, 7 = 7。仅有这两种组合。

2024-04-20 19:58:31 1133

原创 C++代码重用

我们通过一个例子来看看这个如何在一个类中包含其他对象成员的类,我们要定义一个学生的类,包含学生的姓名和学生的考试成绩,我们可以使用一个包含两个成员的类来表示它,一个是学生的姓名,另一个就是学生成绩,对于学生的姓名,我们可以使用字符数组,但是这样会限制长度,我们也可以进行动态内存分配,但是这样需要编写更多的代码来支持,我们还可以使用一个开发好的类的对象来表示,例如string类的对象,对于学生分数,也可以使用数组或者动态内存分配,还可以使用标准C++库中查找一个能够表示数据的类C++标准就提供了这样的一个类,

2024-04-20 15:46:05 1175

原创 C++类继承

类继承的使用原因:C++是面向对象的语言,而面向对象编程的主要目的之一就是提供可以重用的代码,当我们开发新的项目时,尤其是大型项目,我们重新使用已经测试过的代码比我们重新编写代码要好的多,虽然厂商给我们提供了很多的库函数,但是这也有局限性,除非厂商给我们提供库函数的源代码,否则我们无法根据自己的需求对函数进行扩展或修改,计算厂商给我们提供了源代码,我们也不建议这样去做,因为这样修改会有一定的风险,例如不经意修改函数的工作方式或者改变了库函数之间的关系,因此C++提供了更高层次的重用性。

2024-04-18 19:08:56 1501

原创 回溯算法练习day.2

我们可以根据抽象的树形结构可知,符合要求的组合的长度与题目传入的字符串的长度一致,并且我们可以将题目给出的数字映射到一个数组中,数组的下标就是对应的数字,存储的值就是数字对应的字符串,for循环就是横向遍历,而递归是纵向遍历。因为是求组合问题,因此可以使用回溯算法解决,我们以题目的示例1为例,将其抽象为一颗树形的结构,即如下所示。当我们遍历到的值已经大于我们的目标值时,我们可以直接进行回溯,而不需要再进行遍历。该列表不能包含相同的组合两次,组合可以以任何顺序返回。的字符串,返回所有它能表示的字母组合。

2024-04-15 20:33:52 359

原创 C++类和动态内存分配

C++能够在程序运行时决定内存的分配,而不是只在编译阶段,因此,就可以根据程序的需要,而不是根据一系列严格的存储类型规则来使用内存,C++使用new和delete运算符来动态控制内存,但是,在类中使用这些运算符会导致许多新的问题,在这种情况下,析构函数就是必不可少的,下面我们通过一个小程序来看一看这些问题,这个程序是在类中使用new和delete来存储释放字符串我们将函数声明写在一个头文件,即stringbad.h在头文件里定义了一个类,名为Stringbad。

2024-04-15 18:39:52 1764

原创 回溯算法练习day.1

回溯法的作用递归函数与回溯算法是相辅相成的,回溯法往往在递归函数的“下面”使用原因:有些问题无法暴力进行搜索,只能通过回溯法来解决,例如1.组合问题2.切割问题3.子集问题4.排列问题5.棋盘问题回溯算法是一种效率很低的算法理解回溯法。

2024-04-14 15:05:51 846

原创 二叉树练习day.9

题目描述:给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在中。修剪树改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

2024-04-13 17:36:01 1008

原创 二叉树练习day.8

题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(3节点5和节点1的最近公共祖先是节点3。5节点5和节点4的最近公共祖先是节点5。因为根据定义最近公共祖先节点可以为节点本身。1[2, 105]Node.val互不相同p!

2024-04-13 16:13:23 841

原创 C++使用类

C++控制对于类对象私有部分的访问,通常,公有类方法提供是唯一的访问途径,但是有时候这种限制太过严格,以至不适用于某些编程问题,在这种特定的情况下,C++提供了另外一种形式的访问权限——友元,友元有三种友元函数友元类友元成员函数通过让函数成为类的友元,可以赋予该函数与类成员函数相同的访问权限,即可以访问到类的私有部分的成员C++为下面的类提供了类型转换1.只有一个参数的类构造函数将会用于将类型与参数相同的值转换为类类型。

2024-04-13 10:00:19 985

原创 二叉树练习day.7

题目描述:给你一个二叉搜索树的根节点root,返回。差值是一个正数,其数值等于两值之差的绝对值。

2024-04-11 18:53:28 1079

原创 二叉树练习day.6

题目描述:给定一个不重复的整数数组nums。可以用下面的算法从numsnums返回 nums构建的最大二叉树。递归调用如下所示:- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- 空数组,无子节点。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- 空数组,无子节点。- 只有一个元素,所以子节点是一个值为 1 的节点。

2024-04-11 15:24:30 814

原创 C++类和对象

一般来说,类由两个部分组成类声明:以数据成员的方式描述数据部分,以成员函数(方法)的方式描述公有接口class 类的名字//私有部分private:成员定义;//公有部分public:成员定义;类方法定义:描述如何实现类成员函数即类的声明提供了类的蓝图,而类方法定义提供了细节,类似于函数声明和定义通常,C++程序员会将类定义(接口)放在头文件中,将实现类方法的代码放在源文件中,例如,在头文件中对类进行声明Stock类这里将类定义在头文件中stock00.h中//定义一个类。

2024-04-11 11:52:10 1406

原创 二叉树练习day.5

题目描述:给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。17思路:找到深度最大的叶子节点,注意,该节点不一定是左节点,因为我们要求的是最后一行最左侧的值,只需要找到最大的深度就可以,并且这里使用前中后序遍历都可以实现,因此优先都会遍历左节点才到右节点实现:1.定义一个全局变量,用来记录二叉树的最大深度,并初始化为一个不可能到达的最小值,再定义一个变量,记录深度最大的值2.实现递归的三部曲。

2024-04-10 09:20:57 780

原创 二叉树练习day.4

题目描述:给定一个二叉树,判断它是否是平衡二叉树truefalseroot = []true[0, 5000]平衡二叉树:该二叉树中任意一个节点的左右子树的高度差不超过1实现思路:因为我们要求的是二叉树中节点的高度,因此需要使用后序遍历,因为后序遍历是将左右孩子的情况返回给父节点,父节点再根据左右孩子的高度再+1,层层往上返回,因此求的是高度,而前序遍历是由上到下去遍历,因此求解的是深度使用递归来实现:1.确定函数的参数和返回值,传入的应该是根结点,返回值是左右子树的高度。

2024-04-08 19:24:02 1092

原创 二叉树练习day.3

题目描述:给定一个二叉树root,返回其最大深度。二叉树的是指从根节点到最远叶子节点的最长路径上的节点数。32[0, 104]通过根节点高度(根节点的高度使用后序遍历)来求出二叉树的最大深度,使用递归实现1.确定函数的参数和返回值,参数应该是二叉树的根节点,返回值应该是其高度2.确定终止条件,此时终止条件应该为当前的节点为空3.确定单层递归逻辑,先计算左节点的高度并返回,计算右节点的高度并返回。

2024-04-08 17:05:20 1228

原创 二叉树练习day.2

题目描述:给你二叉树的根节点root,返回其节点值的。(即逐层地,从左到右访问所有节点)。root = [1][[1]]root = [][][0, 2000]思路:使用队列来实现,先将当前层的节点存储到队列中,并记录当前层的节点的数量,再根据当前层节点的数量将当前层的元素弹出,因此队列中的元素是在不断变化的,需要根据每一层的节点数量情况来选择弹出的元素。

2024-04-05 19:36:23 817

原创 C++指针

计算机在存储数据时,必须要知道的三个属性信息存储在什么地方存储的值是多少存储的值是什么类型的我们之前使用用定义变量的方式来达到以上的目的在这里,声明语句指出了值的类型为int类型,符号名为a,值的大小为10,并且我们让程序为值分配了内存,并在内部跟踪该内存单元下面我们来看看通过指针来实现这个目的。

2024-04-05 15:51:28 1667

原创 二叉树练习day.1

链接:144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后序遍历。

2024-04-03 19:22:13 612

原创 二叉树学习

树是n个结点的有限集合,当n=0时为空树,在任意一颗非空的树中,有且只有一个特定的称为根的结点,当n>1时,其余结点又可以分为m个不相交的有限集,其中每一个集合又是一棵树,并且称为根的子树树的结点包含一个数据元素以及若干指向其子树的分支,结点拥有的子树称为结点的度,度为0的结点称为叶结点或者终端结点,度不为0的结点称为非终端结点或者分支结点,除根结点之外,分支结点称为内部结点,树的度是树内部各个结点的度的最大值结点的子树的根称为该结点的孩子,该结点称为孩子的双亲,同一个双亲的孩子之间互相称为兄弟。

2024-04-03 09:32:39 741

原创 C++函数模版

函数模版是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可以用具体的类型来进行代替,通过该类型作为参数传递给该模版,可以使编译器生成该类型的函数例如:有一个交换两个int类型的函数,假如要更改为交换两个double类型的函数,一种方法是复制原来的代码,并且都double替换掉所有的int,但是这种修改会浪费时间,并且容易出错,但C++的函数模版功能能够自动完成这个过程函数模版的定义例子函数体;

2024-04-02 17:47:41 683

原创 C++函数重载

1.如果我们只定义了一个函数,当我们调用函数给的的参数与函数原型定义的参数不匹配时,编译器会根据标准进行类型转换,但是,如果我们使用了函数重载,定义了多个函数,其中不止一个原型能让我们发生强制类型转换进行匹配,这是编译器就不会进行匹配,例如。C++的函数重载(函数多态)是指同一个函数的不同表现形式,函数允许有多种形式存在,即函数名称相同,但是函数的参数列表不同。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则他们的特征标相同,而变量名是无关紧要的。C++也不允许这种形式的函数重载。

2024-04-02 13:51:40 193

原创 队列与栈练习day.2

题目描述:给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。s = "()"truetrues = "(]"false'()[]{}'思路:括号不匹配的情况分为3种:多了左括号括号不匹配多了右括号实现括号匹配的方法:1.遇到左括号则入栈,遇到由括号则出栈。

2024-03-31 14:57:40 936

原创 C++引用变量

C++新增了一种数据类型,即引用变量引用是已定义的变量的别名(另外的一个名称),例如将变量b作为变量a的引用,那么就可以交替使用a和b来使用该变量引用变量的主要用途是用作函数的形参,通过将引用变量作为参数,函数将会使用原始的数据,而不是使用其副本,这样除了指针之外,引用也为函数处理大型的结构提供了一种非常方便的途径。

2024-03-31 11:15:26 691

原创 C++内联函数

内联函数的编译代码与其他的函数内联起来,即编译器将使用相应的函数代码替代函数的调用,对于内联代码,函数无需跳转到另一个位置处执行代码,再跳转回来,因此,内联函数的运行速度会比常规函数稍快,但会占用更大的内存。,则使用内联函数调用就可以节省非内联调用使用的大部分时间,另外,由于这个过程很快,因此尽管节省了这个过程的大部分时间,但节省的时间的绝对值不大。因此,我们需要有选择的使用内联函数,如果执行代码的时间比处理函数调用机制的时间长,则节省的时间将只占整个过程的很小一个部分,在函数定义前加上inline。

2024-03-31 09:30:59 363

原创 队列与栈练习day.1

如果新栈不为空,直接就从新栈里依次取出元素,如果新栈为空,则将旧栈的依次出栈放入新栈里,取出新栈中的栈顶元素并更新新栈的栈顶元素指针,之后再将新栈中的内容存放到旧栈里,返回保留的新栈栈顶元素,就可以使用两个栈来实现队列的操作。那么如果要使用栈来实现队列,就是需要改变出栈的顺序,因此就需要一个额外的栈,将原来的栈的元素再依次放入另外一个栈中,就可以使用栈来实现队列,即先入先出。可以只使用一个队列来实现,即假如队列有n个元素,则将n-1元素先弹出再重复加入队列,就可以只使用一个队列来实现栈的操作。

2024-03-29 10:55:04 813

原创 Hello 算法学习--哈希表实现(C语言)

跟随Hello算法这本书使用C语言来实现了数组的哈希,理解了哈希的原理已经工作的方式,了解了哈希冲突发生的原因以及解决的办法,但使用的还不够熟练,而且没有进行解决哈希冲突的代码实现,需要进行补充学习。

2024-03-28 17:01:09 946

空空如也

空空如也

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

TA关注的人

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