![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法每日一题
文章平均质量分 59
星恒star
这个作者很懒,什么都没留下…
展开
-
算法每日一题: 石子游戏 | 一维数组合体为二维简化写法 | 倒序排序写法 | 多层嵌套时,三目运算符的写法 | 两个数组轮流取数组实现 | 一维数组合体为二维简化写法
、原创 2024-02-04 23:45:17 · 410 阅读 · 0 评论 -
算法每日一题: Nim游戏 | 找规律
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false。这道题其实就是找规律,刚开始我还以为是动归,但是列举了不少例子之后,发现有自己直接的规律,ok,直接通过。哈哈,大家好,我是星恒,今天的每日一题真开心,连做了3天牢,终于ak了一道,太不容易了。这道题的本质就是找规律,大家多列举几个例子,其实答案就出来啦。期待大家和我有一样的体验哈!题目:leetcode 292。你和你的朋友,两个人一起玩。原创 2024-02-04 23:43:55 · 646 阅读 · 0 评论 -
算法每日一题:按分隔符拆分字符串 | 字符串 | 特殊位置判断
先简单说一下这道题思路:遍历每一个字符串,寻找separator字符,如果找到,就从这个节点到上一个节点的字符串截下来。是不是咋一眼挺好做,其实不然!给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。返回一个由拆分后的新字符串组成的字符串数组,题目:leetcode 2788。原创 2024-01-21 23:09:38 · 451 阅读 · 0 评论 -
算法每日一题:可获得的最大点数 | 滑动窗口
解释:第一次行动,不管拿哪张牌,你的点数总是 1。方式二的本质和方式一样,都是使用的滑动窗口,只不过这个窗口用的是剩余元素,这样的好处是窗口中元素是连续的!后一个情况的点数和 = 前一种情况的点数和 - 前一种情况数组开头数 + 前一种情况数组结尾的后一个数。输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3。输入:cardPoints = [1,2,3,4,5,6,1], k = 3。输入:cardPoints = [9,7,7,9,7,7,9], k = 7。原创 2023-12-03 09:59:16 · 363 阅读 · 1 评论 -
算法每日一题:从二叉搜索树到更大和数 | 树 | 递归 | 中序遍历
递归的含义就是在一个函数里面执行函数(这个函数是他本身),所以这里千万不要认为return的作用是递归的终止条件(这里如果大家不太理解,建议先看一看递归的基础知识),他只有当用作结束执行自己时,也就是在执行自己的代码前,有语句使这行代码不能执行,(if就有这个功能,return),这样它就不能执行自己了,也就是不能递归了,作用才是作为递归的终止条件;输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]输出:[1,null,1]原创 2023-12-05 16:01:52 · 490 阅读 · 0 评论 -
算法每日一题:到达首都的最少油耗 | 图 | 深度遍历
解释: - 代表 2 到达城市 3 ,消耗 1 升汽油。- 代表 2 和代表 3 一起到达城市 1 ,消耗 1 升汽油。给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0 到 n - 1 ,且恰好有 n - 1 条路。解释: - 代表 1 直接到达首都,消耗 1 升汽油。输入:roads = [[3,1],[3,2],[1,0],[0,4],[0,5],[4,6]], seats = 2。输入:roads = [[0,1],[0,2],[0,3]], seats = 5。原创 2023-12-05 16:05:54 · 392 阅读 · 0 评论 -
算法每日一题:下一个更大的数值平衡数 | 数组下标
其实这里的关键点就是会使用整数数组来记录各个数字出现的次数(往往没经验初学者会使用哈希来弄,但这样哈希的生成以及遍历都非常麻烦,所以不建议使用),这里就可以使用数组下标来替代哈希,既简便,又快捷。思路就是从n开始,依次+1,遍历比n大的每一个整数,如果遍历到的这个数是平衡数,那么返回出去就可以啦,由于我们是从小到大一次遍历的,所以这个数就是我们的最小平衡树;我们只要将每一个数的每一位分离出来,然后记录这个数出现的次数,最后遍历记录次数的数组,如果和下标相等,就说明他是平衡数;给你一个整数 n ,请你返回。原创 2023-12-09 18:08:12 · 385 阅读 · 0 评论 -
算法每日一题:爬楼梯 | 数组下标 | 简单动态规划
其实dp,也就是动态规划的题,就是是找规律,就和小学的找规律题一样,看下一个的值与上一个值有什么关系;写到这里,相信大家已经看出来了这道题的规律,就是f(n) = f(n - 1) + f(n - 2)每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?原创 2023-12-10 08:34:48 · 353 阅读 · 1 评论 -
算法每日一题:寻找峰值 | 二分查找 | 对其深度解析
看到要寻找对峰值,大家肯定最先想到的就是从左往右遍历,当有一个值既大于左边元素值,又大于他的右边元素值,那么他就是那个峰值。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回。返回任意一个峰值,任意两字意味着这道题的可操作性就在这里;我们可以在范围 [l,r] 随意找个随机数nums[i],当。好啦,到这里我们这个问题也就解决了,我们来看以下代码。昨日的每日一题,发的稍微迟了一点哈,今天直接发两篇。峰值元素是指其值严格大于左右相邻值的元素。这样做的时间复杂度是。原创 2023-12-19 21:27:24 · 602 阅读 · 0 评论 -
算法每日一题:使用最小花费爬楼梯 | 简单动态规划
本题的难点就在于,首先,我们要以所求的那个状态为基准,利用前面的状态来推导现在的状态;第二,要好好理解之前的状态,动态规划最核心的观念,就是如何利用之前的状态,来求现在的状态;尤其是这种路径问题,我们需要考虑的是,如何通过之前的状态,来达到现在的状态(也就是说,通过以前的状态,看有哪些状态,前一段时间在拼命学四级了,时间被压榨的没事思考,所以没有认真做每日一题,仅仅是将每日一题记录了一下,而并没有进行总结,接下来的时间里,我将陆续更新之前没弄的每日一题。也就是,如何利用之前的状态,来找到现在的状态。原创 2023-12-17 21:08:16 · 371 阅读 · 1 评论 -
算法每日一题:寻找峰值2 | 网格的最大值奥妙 | 二分查找
在上方的这个情况,假设最极端的情况,上面的每一个值都比大(比他小的情况上一段已经说明),但这时不可能存在的情况,因为这道题定义的边界为的值为-1,所以必会出现。,然后我们判断他的上下两个邻近格子的值,如果(i指第几行,j指第几列,当前元素为mat[i][j])看到这里,是不是觉得这个非传统的二分很神奇,原因他砍去一半元素的理由需要很神奇的推导。,所以当前行的最大值必会大于相邻两行的所有值,所以这一一行的最大值,必是一个峰值。好,我们这时利用二分,不要下方的元素了,直接看上方的元素,将下层。原创 2023-12-19 21:28:48 · 338 阅读 · 0 评论 -
算法每日一题:判别首字母缩写词 | 集合 | 字符串
如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s ,则认为 s 是 words 的首字母缩略词。例如,“ab” 可以由 [“apple”, “banana”] 形成,但是无法从 [“bear”, “aardvark”] 形成。给你一个字符串数组 words 和一个字符串 s ,请你判断 s 是不是 words 的。这道题就是简单的遍历,没啥好说的,考点就是看对字符串和集合基本操做。如果 s 是 words 的首字母缩略词,返回 true_问题:leetcode 2828。原创 2023-12-20 08:15:16 · 469 阅读 · 0 评论 -
算法每日一题:美丽塔2 | 单调栈 | 动态规划 | 抛物线
因为很明显,最大值左/右侧的元素和计算是有联系的,然后我们就可以用动态规划啦)但是,如果前方并不是单纯的递增递减,如图所示,当前值是递减,但是他的元素和并不是我们刚才说的两种情况,我们还需要的得到x,来得到x前部分的元素和,即:x前元素和 + (max - x)* maxHeights[max]的元素一个一个放进去,然后将比当前元素大的出栈,小的留下,这样一来,栈的元素永远保持单调递增,而且当我们遇到上方的情况时,我们正好能将之前比当前值小的元素都留下来,这样一来,栈顶元素,就是我们想要的x,即。原创 2023-12-21 11:16:43 · 1188 阅读 · 0 评论 -
算法每日一题:得到山形数组的最少删除次数 | 动态规划 | 抛物线/山形曲线
这等价于,我们需要找出数组的一个最长的子序 列,并且这个子序列是一个「山形状数组」。和上一道题一样(如果大家没看,可以看看上到题的解释,更为详细),这道题也是抛物线的问题,遇到这种问题,首先想到的就是递归 + 分类递增递减曲线。发现了吧,这道题比之前的题难,昨天的dp只是使用了一下单调栈,而今天直接上了循环,时间复杂度就多了,很明显复杂度直线上升。今天的每日一题和昨天的每日一题有异曲同工之妙,区别在于在dp中,一个用的单调栈寻找之前的状态,一个使用循环遍历寻找。题目:leetcode 1671。原创 2023-12-22 11:10:48 · 351 阅读 · 0 评论 -
算法每日一题:收集足够苹果的最小花园周长 | 数学公式
整数坐标 (i, j) 处的苹果树有 |i| + |j| 个苹果。fabs(x) 计算 x(高精度的double,float)的绝对值。给你一个整数 neededApples ,请你返回土地的。需要注意的是,要好好读题和画图,要不很容易就会陷入误区。你将会买下正中心坐标是 (0, 0) 的一块。2)的平方根,常用于计算三角形的斜边长。abs(x) 计算 x(整数)的绝对值。给你一个用无限二维网格表示的花园,pow(x,y) 计算x^y的值。sqrt(x) 计算x的平方根。hypot(x,y) 计算(x。原创 2023-12-24 19:16:45 · 368 阅读 · 0 评论 -
算法每日一题:不浪费原料的汉堡制作方案 | 二元一次方程
请你以 [total_jumbo, total_small]([巨无霸汉堡总数,小皇堡总数])的格式返回恰当的制作方案,使得剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量都是 0。我们第一反应就是求得 x 和 y ,判断他们是否为整数,但是很明显,在java中,整数除以一个数,得到的是一个整数,因为他会自动向下取整,所以这个方法行不通。好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!好,话不多说,我们直接来看题。原创 2023-12-25 10:19:20 · 347 阅读 · 0 评论 -
算法每日一题:参加考试的最大学生数 | 动态规划 | 状态压缩
给你一个 m * n 的矩阵 seats 表示教室中的座位分布。如果座位是坏的(不可用),就用 ‘#’ 表示;学生可以看到左侧、右侧、左上、右上这四个方向上紧邻他的学生的答卷,但是看不到直接坐在他前面或者后面的学生的答卷。请你计算并返回该考场可以容纳的同时参加考试且无法作弊的 **最大 **学生人数。今天的题目竟然是一道困难题目,看着就不简单,我们的目标是:理解如何做 + 学一些思路!这次题目涉及的知识:动态规划,状态压缩(位运算)学生必须坐在状况良好的座位上。首先,我们说一下数据的存储。原创 2023-12-30 15:16:06 · 365 阅读 · 0 评论 -
算法每日一题:保龄球游戏的获胜者
开始的整数数组 player1 和 player2 ,分别表示玩家 1 和玩家 2 击中的瓶数。今天的每一一题是一道简单题目,但是没能秒掉,原因就是题意理解不到位,边界问题没有判断清楚。不过这本来就是一个试错,迭代,积累经验的过程,加油加油,相信做多了,自然就可以秒掉啦!这道题最主要的事理解题意,注意他说的前两个元素为10,是说的任意元素的前两个元素。还有注意0,1的边界问题,要分类讨论,最后如果能合并就合并了。优化:(两种方式的本质是一样的,只是第二种的写法更优雅!玩家的得分是其 n 轮价值的总和。原创 2023-12-30 15:20:03 · 575 阅读 · 0 评论 -
算法每日一题:购买两块巧克力 | 两个最小值的遍历
但是还有一个问题没有解决,就是我们如何知道这个最小值的下标,毕竟我们只能找到最小值,如果想知道他的下标,需要再次遍历寻找(这里不用担心有和最小值相同值的问题,因为无论设置了哪个最小值为最大值,第二次遍历都会遍历到另一个和最小值相同值的值),这种方法可行,但是时间会又加n,然后一看数组大小,誒,不大,好,那我们就可以使用“数组”哈希了,也就是将数组值设为数组的下标(索引),我们就可以直接通过值来找到他的索引,我们也就找到了最小值的索引啦!如果购买任意两块巧克力都超过了你拥有的钱,请你返回 money。原创 2023-12-30 15:38:19 · 394 阅读 · 0 评论 -
算法每日一题:一周中的第几天 | 日历类题目
大家好,我是星恒,已经连续5天没有发每日一题了,其实我每天都有写帖子的草稿,但是这几天学校考试,总是着急的写完就去看专业课了,一直没机会发出来,所以趁着这几天元旦休息,就一下将前面几天的每日一题发出来啦!思路就是算出现在到1971年有多少天,然后和7取余(当然,这里是将总天数为1971的附近几天的周一再取余),这样就做出来啦。这次的题目是有关年月日的,如果大家没做过这类型的题,这道题还是值得一看的;好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!原创 2023-12-30 15:44:03 · 496 阅读 · 0 评论 -
算法每日一题: 经营摩天轮的最大利润 | 模拟
然后比较利润的大小,取较大的值。当摩天轮转动结束后,停止模拟,此时如果还有人等待,计算最多人数4转动一次是否会亏损,如果亏损,停止,当前值就是最大值,不亏损,说明可以继续转下去4人的情况,即直接将剩余人数符合4人标准的情况的利润直接求出来;求完4的情况,如果此时还有不足4人的情况,单独拎出来求,看是否会亏损。注意,如果有超过 4 位游客在等摩天轮,那么只有 4 位游客可以登上摩天轮,其余的需要等待。祝大家元旦快乐,在新的一年里,学业进步,工作顺利,心想事成!如果不存在利润为正的方案,则返回 -1。原创 2024-01-05 21:54:06 · 326 阅读 · 0 评论 -
算法每日一题:统计重复个数 | 字符串
由此构造得到两个字符串,其中 str1 = [s1, n1]、str2 = [s2, n2]。这道的题意并不是很好理解,尤其这句:找出一个最大整数 m ,以满足 str = [str2, m] 可以从 str1 获得。其实就是将m个str2组合成的字符串,能够在str1中找到,言外之意,就是str1中有多少个str2。请你找出一个最大整数 m ,以满足 str = [str2, m] 可以从 str1 获得。好,我们先从图上来看一看,我们如何找到str1中的str2。题目:leetcode 466。原创 2024-01-05 21:55:46 · 551 阅读 · 0 评论 -
算法每日一题:从列表中移除节点 | 链表与栈
我刚开始想的是将链表遍历一遍,然后将比最后一个元素小的值都剔除一遍,然后再遍历剔除后的链表,剔除比倒数第2个值小的值,依次类推,直到剔除到头节点。在处理链表时,栈是一种非常常用的技巧,因为处理链表的一个难点,就是链表不容易从后往前访问,而栈恰好具有这种特征(出栈时,后面的先出),所以这不就一拍即合嘛!今天的题目是一道比较经典的链表题目,他涉及到链表的遍历,链表的创建,处理链表的常用方法,以及常用方法中使用栈的一系列常用技巧。本题我们使用栈的方法来解决,如果大家想了解其他方法,我在下面附了代码。原创 2024-01-05 21:57:51 · 650 阅读 · 0 评论 -
算法每日一题: 被列覆盖的最多行数 | 二进制 - 状态压缩
没错,我们的大体思路也是这样,但是当我们衡量竖列情况是否可以覆盖横行使,我们需要遍历每个横行的元素,这无疑使我们的复杂度多了一个n;但由于他们的元素都是0,1(或者可以用0,1表示),这时,我们就很容易想到位运算里面的“ | ” (或)运算,我们只要将数列情况和横行情况一位或,如果位或后值不变,这样我们就能确定他全覆盖了。今天的题目又是一道有关二进制的题目,有我们之前做的那道 参加考试的最大学生数的 感觉,哈哈,当然,比那道题简单多了,这道题感觉主要的考点就是二进制,大家可以好好总结一下这道题目!原创 2024-01-05 21:59:45 · 658 阅读 · 0 评论 -
算法每日一题:在链表中插入最大公约数 | 链表 | 最大公约数
hello,大家好,我是星恒今天的题目是有关链表和最大公约数的题目,比较简单,核心在于求解最大公约数,我们题解中使用辗转相除法来求解,然后我们会在最后给大家拓展一下求解最大公约数的四个方法,供大家学习。原创 2024-01-06 09:01:49 · 452 阅读 · 0 评论 -
算法每日一题:赎金信 | 字符和整数
我们只要把26个字母使用数字 0 - 25表示出来,然后使用数组给字符串出现的字母计数,这样我们遍历第一个字符串magazine,存入字符串中字符出现次数,然后遍历ransomNote,减掉对应字符出现的次数,如果次数出现负数,那么说明magazine的字符不能全部包含ransomNote里面的字符!然后这里如果是算法新手,可能会在字符间相加减有一定的疑惑:加减后是否是ACSII整数,还是还是字符?好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!原创 2024-01-07 08:44:31 · 515 阅读 · 0 评论 -
算法每日一题:回旋镖的数量 | 坐标距离 | 哈希
所以我们只要得到有多少个点和这个点距离相等,当然,由于相等距离也有好几种情况,所以我们使用hash将距离的情况存储起来,只要遇到和这种情况相同的,就将他的相等点 + 1。这道题目的意思是,让我们在给的points点中寻找3个点,这三个点可以构成回旋镖型,也就是v字型,某一点距离其他两个点的距离相等。是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!原创 2024-01-08 23:39:14 · 483 阅读 · 0 评论 -
算法每日一题:字符串中的额外字符 | 动归 | 哈希 | 字符串
维护一个大小为s.length()的dp数组,遍历s中的每个字母(i),然后再从当前字母开始往前遍历(j),看i与j之间的字母构成的字符串是否在dictionary中,也就是能否构成一个单词,如果可以,我们比较现在这种分割造成的剩下字符最少,还是之前分割剩余数 + 1的剩下字符最少。呜呜呜,又是拖更的几天,这几天由于考试 + 放假,一直是只做没发的状态,今天就将这几天的每日一题都补回来啦!好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!不在任何子字符串中。原创 2024-01-13 19:55:14 · 512 阅读 · 0 评论 -
算法每日一题:统计出现过一次的公共字符串 | 哈希 | getOrDefault()
这道题的思路比较简单,就是分别将两个字符串数组的元素作为key存入map中,值为出现的次数,然后遍历某一个map,如果在自己的数组中出现的次数为1,并且在对方数组中出现过,并且在对方数组中也只出现过一次,那么,这个字符串计入 **数目 **中。今天给大家带来的又是一道经典的哈希的题目;这道题本身并不难,但他将getOrDefault()函数利用的简直不要太优雅了,很适合作为理解Map应用的学习题目。:**字符串 **在两个字符串数组中都出现,并且在各自的字符串数组中都只出现过一次。原创 2024-01-13 20:00:26 · 501 阅读 · 0 评论 -
算法每日一题:构造限制重复的字符串 | 字符串 | 数组与哈希联系
我们肯定时希望前面的字母越大越好,但是由于有连续出现次数的限制,所以我们在到达限制时,我们找到第二大的字母插入一个,然后继续插入当前最大的字母;如果在字符串 a 和 b 不同的第一个位置,字符串 a 中的字母在字母表中出现时间比字符串 b 对应的字母晚,则认为字符串 a 比字符串 b。而StringBuilder和StringBuffer,底层是char[]型,是变量,修改值,会在原来的空间直接修改。本题中,我们可以把字符串s中的字符存入hash中,键为26个字母,值为出现的次数,以方便我们随取随用;原创 2024-01-13 20:03:24 · 1078 阅读 · 0 评论 -
算法每日一题: 删除排序列表中的重复元素 | 链表的删除
这道题目思路非常简单,使用双指针,一个指左,一个指右,然后依次向右移动,当左指针和右指针指向元素值相同时,删除右指针指向元素,右指针向右移动一个单位;今天给大家带来的是一道简单的链表删除题,题目很简单,不过可以帮助我们很好的复习链表的删除,尤其适合基础薄弱的友友们学习 ~这道题主要考查了链表的删除基本操作,他和插入的区别:插入有两个指针的操作,删除只需要一个指针即可。好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!给定一个已排序的链表的头 head ,原创 2024-01-14 08:24:43 · 382 阅读 · 0 评论 -
算法每日一题: 最大字符串匹配数目 | 哈希 | 哈希表 | 题意分析
对于其它语言,我们可以存储字符串的哈希值,改为判断 words[i]\textit{words}[i]words[i] 的反转字符串的哈希值是否存在。哈希值需要保证不会冲突,本题中字符串的长度为 222 并且只包含小写字母,因此可以使用 100a+b100a + b100a+b 作为哈希值,其中 aaa 和 bbb 分别是两个字符的 ASCII\text{ASCII}ASCII 值。今天给大家带来的是hash,思路有好几种,需要注意的是这中简单的题目需要仔细看条件,往往他们有对应题目的特殊的解法。原创 2024-01-17 23:48:03 · 466 阅读 · 0 评论 -
算法每日一题: 拿出最少数目的魔法豆 | 排序 | 越界 | 最大最小值技巧 | 枚举
这道题要求我们取出最少的魔法豆,观察示例我们可以发现,我们可以以某一个魔法豆的数量为基准,比这个魔法豆数量多的,就拿出一些魔法豆,使之和基准魔法豆的数量相等;由于最后得到的魔法豆数量是整数,所以很明显,我们计算剩余的魔法豆的数量更容易,我们只要计算出有几个数字比基准数字大就行,然后使用 **总数 - n(比基准数大的数字的数量) * 基准数 = 拿出魔法豆数 **以某个魔法豆数量为基准,依次比较其他魔法豆,得到拿出魔法豆的数量。他的思路很简单,但是其中的细节,很是值得我们思考和注意。原创 2024-01-18 22:39:43 · 455 阅读 · 0 评论 -
算法每日一题: 删除排序列表中的重复元素2 | 循环 | 链表的删除 | 虚拟节点
由于我们是要删除,所以我们需要知道删除节点的前一个节点。我们遍历该链表,当遇到当前值的下一个值和下下个值相同时,把他们删除,并记录该值,然后看后面的情况。今天的题目是昨天题目的进化题,他对链表的删除加深了理解。最重要的是学会了对循环中的特殊部分的处理,还有设置虚拟节点的情况。好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。删除原始链表中所有重复数字的节点,只留下不同的数字。原创 2024-01-15 23:50:30 · 501 阅读 · 0 评论