每日一题
文章平均质量分 63
算法 编程
ZNineSun
大道至简,返璞归真
展开
-
122. 买卖股票的最佳时机 II
因为我们每一步都是最优解,所以只需要考虑最后一天的情况即可,但是为了让利益最大化,所以最后一天手上只有持有现金才能让收益最高,所以我们最终取的结果应该是dp[length][0]声明一个二维数组dp[i][j],之所以使用二维数组是因为变化的状态有两个,一个是哪一天,一个是这一天持股状态是持有还是未持有。这是一道很经典的动态规划类型题目,如果看过我之前写的关于动态规划类型的题目,便会很了解做这种题目的套路。对于dp[i][0]表示在第i天持有的是现金未持有股票,我们只需考虑前一天(i-1天)原创 2023-02-02 18:19:41 · 288 阅读 · 0 评论 -
38. 外观数列
今天给大家带来一道比较有意思的题目,先看看题目描述。每一次都是对前面一个字符串的每一位的描述。理解了题目的思路,代码自然就好写啦。n:表示我们要计算多少次。代码如下:(Java版)原创 2023-01-30 15:35:01 · 399 阅读 · 0 评论 -
29. 两数相除
直到100>>5=3,刚好大于等于我们的除数3,这时我们将$ 100-2^5*3=4 $,也就是减去了32个3,接下来我们再处理4,同样手法可以再减去一个3。对于这种类型的题目,当题目要求不能使用乘法、除法时,那么则需要我们从移位、或、与、异或等位运算的角度来进行考虑,接下来我带着大家从这道题目入手,看看位运算到底是怎么应用的。要求商,我们首先想到的是减法,能被减多少次,那么商就为多少,但是明显减法的效率太低,那么我们可以用位移法,因为计算机在做位移时效率特别高,余数,是一种数学术语。原创 2023-01-28 20:50:04 · 970 阅读 · 0 评论 -
62. 不同路径
接下来,我们继续确定初始条件,对于第一行的格子只能从左边移动而来,对于第一列的格子只能从上面的格子移动而来,所以dp[0][i]=1,dp[i][0]=1。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。对于动态规划类型的题目,我们只需先确定状态转移方程,然后在确定初始条件即可将问题迎刃而解。今天给大家继续带来一道经典的动态规划题目。问总共有多少条不同的路径?原创 2022-11-07 16:24:36 · 145 阅读 · 0 评论 -
56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。如果既不满足交集也不满足子集的话,我们就认为他是一个独立的区间,否则的话,我们就需要将两个结果集进行合并,同时和下一个区间进行对比。今天这道题难度一般,主要是感觉挺好玩的,和大家分享一下。原创 2022-11-04 16:21:40 · 195 阅读 · 0 评论 -
22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。生成n对括号,则要保证括号都合法的话,那么最基本的要求便是。按照这种思路进行递归和剪枝,便可以罗列出所有的括号匹配情况。今天给大家分享一道递归+剪枝类型的题目。原创 2022-10-21 15:03:55 · 175 阅读 · 0 评论 -
543. 二叉树的直径
当然很多人想当然的认为树的考查只有深度优先遍历(DFS)以及广度优先遍历(BFS),其实这个说法是错误的,因为DFS只是对应二叉树的前序遍历,BFS也只是对应层次遍历而已。给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。今天给大家带来一道树类型的深度优先遍历题目。对于树类型的题目,无论怎么考无非就是考察。原创 2022-10-07 18:52:08 · 139 阅读 · 0 评论 -
把二叉搜索树转换为累加树
它就是想让我们求树中大于等于该节点值的所有节点的总和,啥意思呢,比如题目示例1中4这个结点,那么我们需要相加的元素应该是全部大于等于4的,根据二叉搜索树的特性,我们只需全部遍历4的右子树,并且在遍历过程中将结点值相加得到的最后结果便是结点4的新值,大于等于4的值有:4,6,5,7,8,很明显全是其右子树的值。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。原创 2022-09-10 22:30:10 · 231 阅读 · 0 评论 -
猿创征文|461. 汉明距离
今天给大家带来一道位运算类型的题目,题目很简单,但是很多人对于位运算没有一个比较清晰的认知,今天通过这道题目带大家了解一下。这道题其本质就是让你将x,y转化为2进制,然后计算两个二进制之间不同的位数。两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。就是从最右边也就是最低位开始比较,判断该为是否是1,如果是1,则。我们无需直接将x,y进行二进制的转换,我们可以一位一位的去比较。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。上面这个代码什么意思呢?...原创 2022-09-01 10:32:12 · 120 阅读 · 0 评论 -
437. 路径总和 III
后来我才注意到,虽然树的每一个结点的都是int类型,但是整型超过128之后就无法通过==来进行对比,所以声明为 long或者更高精度的值都可以。给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。今天给大家带来一道深度优先遍历的题目,要知道树的前序遍历就是深度优先遍历,按照这个思路很多题目就会很轻松的解决。这道题我只需要穷举就好,思路也很简单,我们只需记住每一个结点的父节点,然后一直向上去找,一直找到根节点为止。...原创 2022-08-31 16:35:24 · 179 阅读 · 0 评论 -
416. 分割等和子集
打卡!!!每日一题今天带着大家做一道相对比较难的题目,当然我会通过讲解01背包问题带着大家过渡一下。题目描述:给你一个 只包含正整数 的 非空 数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。题目示例:再看这道题之前,我们先研究一下01背包的问题,为啥要研究01背包呢,这道题其实限制条件很明显,首先数组里的元素总和一定是偶数,其次,我们只需要能找到元素之和==sum/2的集合就可以了。...原创 2022-08-30 17:36:14 · 828 阅读 · 1 评论 -
406. 根据身高重建队列
返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。所以有了以上基础知识作为支撑,我们就可以将排好序的身高列表,依次放在一个list里,我们以题目示例1为例:[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]按照身高由大到小的排序:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]如:一个数组里有以下元素:[3 , 4 , 1 , 9 , 0 , 7 ]原创 2022-08-22 01:30:05 · 279 阅读 · 0 评论 -
394. 字符串解码
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。我们在判断数字的时候需要注意,如:100[abc],此时我们在遍历字符串的时候呢,很容易把1 0 0分割开。同时我们根据括号的匹配规则,遇到左括号进栈,遇到右括号就出栈,一直出栈到遇到能与之匹配的左括号为止。输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。栈运算类型的题目比较常见的题型有:括号匹配,表达式求值等。给定一个经过编码的字符串,返回它解码后的字符串。......原创 2022-08-18 12:42:13 · 299 阅读 · 0 评论 -
337. 打家劫舍 III
打卡!!!每日一题今天给大家带来一道经典的动态规划题目:打家劫舍系列。题目描述:337. 打家劫舍 III示例:这道题,我们首先要找到一个突破口,如果我们从根节点来出发,那么到底要不要偷根节点,我们无从判断,因为其受制于子节点,所以我们需要找一个不受制于任何一个结点的结点来下手,很明显,叶子节点最适合不过了,因为从叶子开始,其后继结点为空。同时我们用一个数组来保存每一个结点的盗窃情况[select,notSelect],即偷和不偷对应的金额。如果想先遍历叶子节点,在遍历根节点,很明显后序遍历在合适不过了。原创 2022-08-09 00:38:42 · 574 阅读 · 0 评论 -
287.寻找重复数
所以我们在重新一个指针finder指向起始位置,让慢指针从相遇位置一步一步的往前走,刚好会在环的入口处相遇,因为在finder指针刚好走a步的时候,慢指针走了(k-1)L+c步,而(k-1)L相当于绕环走了若干圈又回到和快指针相遇的位置,而c步又刚好回到环的入口。给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。很明显这个链表是有环存在的,这是因为重复元素所导致的,所以解决本题的关键就是找到这个链表的。......原创 2022-08-05 15:23:11 · 303 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
两个节点在同一侧的话,我们需要用一个Hash表存储每个节点的所有父节点,然后获取p,q的父节点列表,因为我们需要层数最深的父节点,所以我们可以考虑采用中序遍历二叉树,这样的话层数最深的结点就会在链表的前面。百度百科中最近公共祖先的定义为“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。今天给大家带来一道树类型的题目,也是一道比较经典的深度优先遍历的题目。判断是否在树的两侧,我们只需划分左右子树即可。...原创 2022-08-02 13:15:35 · 234 阅读 · 0 评论 -
221. 最大正方形
本题思路很简单,直接暴力解决,两个for循环遍历,一直遍历到最右下的结点,然后找到一个面积最大值,由于时间复杂度太高,也对不起我们的智商(PS听我吹吹牛就算了,在真正笔试或者面试的时候一定要用最快的速度解决出来,只要能AC就是厉害),下面我们讨论一下动态规划的解决办法。如果D的边长取A的边长+1,即D的边长=4,那么其组成的大正方形,一定包含E区域,这就不合理了,因为题目要求的是我们的正方形必须全部为1。我们定义dp[i][j],表示以(i,j)为右下角的,且只包含1的正方形的边长最大值。......原创 2022-07-30 23:55:29 · 238 阅读 · 0 评论 -
207.课程表
在了解什么叫拓扑序列之前,我们需要先知道数据结构中的图,其图分为有向图和无向图。而在有向图中,如果该图中存在环,则此图将不会有拓扑序列给定一个包含n个节点的有向图G,我们给出它的节点编号的一种排列,如果满足对于图G中的任意一条有向边(u,v),u在排列中都出现在v的前面。如何构造出拓扑序列从上图可以看出,拓扑排序就是依次去找入度为0的结点,所以一旦一个有向图中存在环的话,就像下图所示有向有环图。......原创 2022-07-28 16:17:37 · 294 阅读 · 0 评论 -
152. 乘积最大子数组
给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。在上面的这个过程中,我忽略了负值的情况,也就是说前面可能是负值,后面又乘了一个负值之后,就会变成一个较大的值。刚开始看到这道题,对其很是轻蔑,想着这不就是一道很入门的动态规划题目吗,还是老规矩,找状态转移方程。则有dp[i]=max{nums[i],nums[i]*dp[i-1]}即dp[i]表示到第i个结点对应的最大连续子数组的乘积。初始值dp[0]=nums[0]=2;......原创 2022-07-25 14:40:15 · 755 阅读 · 0 评论 -
排序算法—归并排序
注意一般而言,对于N个元素进行k路归并排序时,排序的趟数m满足k^m=N,从而m=logN,又考虑到m为整数,所以m=「logN]。,先看下图,体会一下归并排序的过程。归并的含义是将两个或两个以上的。所谓2路归并是指两两合并。...原创 2022-07-23 19:19:06 · 325 阅读 · 0 评论 -
141.环形链表
打卡!!!每日一题今天给大家分享一道链表类型的题目,题目很简单,主要是处理的方法,本文主要有两道题,带着大家由第一道题过渡到第二道题目。原创 2022-07-22 14:28:39 · 213 阅读 · 0 评论 -
121. 买卖股票的最佳时机
设计一个算法来计算你所能获取的最大利润。若prices[i]=min,计算第i天的收益dp[i]=price[i]-min;说明o(n^2)的时间复杂度不行,我们就只能乖乖的去思考其动态规划的思想了。后面为继续为大家每日分享一题,也欢迎大家一起来打卡,共同进步!最后我们找出dp[i]中的最大值。......原创 2022-07-21 10:55:59 · 143 阅读 · 0 评论 -
101. 对称二叉树
全部符合对称的要求,则说明第三层是对称的,如果还有第三层、第四层、第五层…我们依此逻辑继续向下判断即可。第二层右侧的2这个节点,其右节点=3;我以题目中的示例1为例,第二层左侧的2这个节点,其左节点=3;给你一个二叉树的根节点root,检查它是否轴对称。是否轴对称,其实就是让我们判断左右两边的子树是否相等。第二层左侧的2这个节点,其右节点=4;第二层右侧的2这个节点,其左节点=4;今天给大家分享一道递归类型的题目。在深入一点,其实就是让我们判断。代码(PSJava版)...原创 2022-07-18 14:47:43 · 231 阅读 · 0 评论 -
96. 不同的二叉搜索树
于是G(n)=G(0)*G(n-1)+G(1)*G(n-2)+G(2)*G(n-3)+…+G(n-1)*G(0)比如我们的n=7,i=3,则对应的结点序列为[1,2,3,4,5,6,7]以i为根节点,则其左子树结点个数为i-1,右子树结点个数为n-i。则有G(n)=f(1)+f(2)+f(3)+…我们先假设n个结点对应的二叉搜索树的个数为G(n);记f(i)表示为以i为根的二叉搜索树的个数。则f(i)=G(i-1)*G(n-i)右子树的结点有[4,5,6,7]上面的dp就是我们的G(n)...原创 2022-07-17 16:57:50 · 201 阅读 · 1 评论 -
64. 最小路径和
打卡!!!每日一题今天来一道经典的动态规划题目题目描述:题目示例:我们分析一下:由于路径的方向只能是向下或向右,因此会有以下几种情况:我们记dp[i][j]表示到[i,j]的最小路径值是不是很简单了,我们看看代码(PS:Java版)...原创 2022-07-14 16:09:27 · 164 阅读 · 0 评论 -
31. 下一个排列
题目描述:示例:我刚开始读完题目一脸懵逼。为了防止大家和我一样,我就给大家翻译翻译题目说了啥。按照这个思路,我们继续向下思考,刚好比当前数大的数,那么我们一定是从位数最低的开始去找,即从后面开始找,找的方法也很简单,我以排列[4,5,2,6,3,1]为例,我们先确定第一个位置i,使得i1不符合,我们让i–,此时i指向3,i-1指向6,6>3也不符合。继续让i–,此时的i指向6,i-1指向2...原创 2022-07-11 15:57:26 · 213 阅读 · 0 评论 -
leetCode-栈类型详解
在刷题的时候遇到一个后缀表达式的题目,然后感觉该题是比较经典的栈应用类型的题目,正好借着该题,给大家聊一聊栈的用法,顺便解决了这道题。众所周知,栈是是一个先进后出的数据结构,利用该特性,在程序的设计中十分常见,如:括号匹配、表达式求值、在递归中的应用等都离不开栈这一数据结构。我下面一一给大家简单说一下。(PS:栈的数据结构我就不再此处赘述,大家可以自行了解)假设表达式中允许包含两种括号 :|直|括号和方括号 ,其嵌套 的顺序任意 即([]())或[([][ ])]等均为正确的格式,[(])或([())或((原创 2022-06-28 18:55:55 · 586 阅读 · 0 评论 -
前缀和差值详解
最近做题的时候,遇到了很多求数组中连续子数组值的和问题,简单点的我还能通过滑动窗口等方法解决掉,后来发现越来越困难,然后看到网上的很多解析,发现很多都是通过一种新的解题思路:前缀和的思路去解题,然后我用该方法做了几道题,略有所感,下面把思路和通过题目实际去解决的过程给大家分享一下。顾名思义,是要求前缀的总和。对于一个存放数字的数组而言,前缀就是指的数组的前k项,因此对应的前缀和就是数组前k项的和。前缀和一般用来求数组中连续段子数组的值的和。同时为了优化查询速度,我们保存前缀和的方式采用HashMap,因为H原创 2022-06-17 23:18:54 · 269 阅读 · 0 评论 -
每日一题:剑指 Offer 15. 二进制中1的个数
今天通过一道简单的题目看看位运算到底是个怎么一回事,很多人都不太理解位运算的意义。在我们cpu计算时,加,减,位运算要比乘除速度快的特别多,其中比较常见的位运算有:&(与) ||(或) ^(异或) 等。<<左移· >> 右移题目描述:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。题目示例:我们看看这道题,以11为例,11的二进制为1011,很明显有3个1。我们的任务就是通原创 2022-05-22 10:28:27 · 136 阅读 · 0 评论 -
每日一题:剑指 Offer 33. 二叉搜索树的后序遍历序列
今天带大家通过一道相对比较难的题再来看看分治和递归的思想题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。题目示例:首先这道题,我们先关注两点:1.二叉搜索树2.后序遍历什么叫二叉搜索树,即存在左子树的话,则左子树的值都小于根节点,存在右子树的话,则右子树的每一个结点都大于根节点。后序遍历有什么特点呢?首先后序遍历的顺序是:左子树->右子树->根节点两个结合起原创 2022-05-22 00:17:48 · 280 阅读 · 0 评论