每日一题
文章平均质量分 79
zcz5566719
这个作者很懒,什么都没留下…
展开
-
【每日一题】23年4月
比较有思维量的题目。首先我们需要思考下最终的结果是处于什么区间上的,也就是我们需要选在一个长度为 k 的区间最后将所有的石子搬运到这个区间上。另外我们还需要思考,如何实现最大和最小的移动。原创 2023-05-03 23:10:02 · 653 阅读 · 0 评论 -
【每日一题】 1912. 设计电影租借系统(数据结构设计)、查询差绝对值的最小值 H(前缀和,绝对值问题)、 最大子序列交替和 (dp, 最后一个元
文章目录1912. 设计电影租借系统 H(数据结构设计)1906. 查询差绝对值的最小值 H(前缀和,绝对值问题)1911. 最大子序列交替和 M (dp, 最后一个元素的操作)1912. 设计电影租借系统 H(数据结构设计)设计类的题目,需要考虑如何合理的运用数据结构。系统的功能要求可以分为两个部分,一个是要求按照给出的优先级返回对应的内容,一个是两个无返回值的操作,借出和还回。很明显这里是需要维护多个优先队列来实现给定优先级的对应内容的。比较难的点在于,如何处理借出的书籍和还回来的书籍。方案原创 2021-10-04 18:21:03 · 484 阅读 · 0 评论 -
【每日一题】只有两个键的键盘(dp、数学), LIS问题变种:最长递增子序列的个数(dp+二分 nlogn)
文章目录一道dp的题目,但是美妙之处在于这道题有数学解法。首先对于dp的思路,dp[i]表示 i 个字符时候的最小次数,dp[i] = dp[i/j]+j 得到转移方程。一个小优化在于,因为是找的因子,i/j * j = i 因此我们枚举到i\sqrt{i}i就可以了。更为巧妙的数学解法是,进行拆分的时候肯定 a1*a2*a3 = n 一定是要找到因子的。而实际的代价是 a1+a2+a3 考虑到a1*a2>=a1+a2。因此,我们其实找到全部质因子就可以class Solution {原创 2021-09-20 23:06:36 · 310 阅读 · 0 评论 -
【每日一题】按权重生成随机数(二分+随机数)、不含连续1的非负整数(数位DP)、单词搜索(字典树)
文章目录528. 按权重随机选择528. 按权重随机选择题目有点考察设计的思路的问题但是核心还是在于如何实现映射,也就是实现按照给定概率的随机分布。这里采用了类似几何概率的思想,利用前缀数组容易得到几何的概率,然后我们直需要在区间内去随机生成,就可以保证了服从给定的概率分布。然后利用二分查找可以找到小于这个数字的最大边界。比如[1, 3] 就会presum = [1, 4]。那当index= 3 的时候就需要返回2,其实就是target>nums[mid]时候需要left = mid+1;而原创 2021-08-31 23:12:20 · 181 阅读 · 0 评论 -
【每日一题】leetcode杂题宣讲
文章目录879. 盈利计划879. 盈利计划可以看出来是一个dp的问题,并且给出了数据范围是100左右,因此可以猜到是O(n3)O(n^3)O(n3)的复杂度的问题。但是这个问题的特点在于,是让你返回结果大于某个值的方案数量。对于背包问题,有一种典型的问题是给定一个盈利,然后我们可以计算得到这个盈利的最大值。比如我们可以先问得到最大的收益是多少,然后再follow up得到最大收益的方案数量是多少。对于这个题目,我们要求的大于某个值的方案数量,这就需要我们重新设计dp了。这里有一个挺巧妙的设计思路原创 2021-06-09 20:39:39 · 243 阅读 · 1 评论 -
【每日一题】1月每日刷题总结(并查集)
文章目录605. 种花问题 (贪心)239. 滑动窗口最大值 模板题 单调栈86. 分隔链表399. 除法求值 (模板题 并查集)1202. 交换字符串中的元素 M (并查集,连通元素有序性)1203. 项目管理 H(多层次拓扑排序)803. 打砖块 H (反向并查集)947. 移除最多的同行或同列石头 H (二维并查集合并)其他题目主要是思路605. 种花问题 (贪心)虽然是贪心,但是这题目处理贪心的思路是我没有想到的。这个题目首先是找到了一个规律,对于没有种花的一段区域,左端点是lll, 右端点原创 2021-06-09 20:17:17 · 425 阅读 · 0 评论 -
如何优雅的求解斐波那契数列
题目背景就不再多说了,直奔主题。三个方法,递归,迭代与快速幂。递归方法 public int fib(int n) { if (n == 1 || n == 2) return 1; else return (fib(n-1)+fib(n-2)); }时间复杂度:O(2n)O(2^n)O(2n),并且会爆栈迭代方法显然我们其实只需要前两个状态量,因此直接保存前两个 public int fib(int n) { if (n =原创 2021-03-02 11:45:57 · 136 阅读 · 0 评论 -
【每日一题】12月每日刷题总结(贪心,单调栈)
文章目录204 计数质数E (筛法)621. 任务调度器(偏向思路)204 计数质数E (筛法)一道经典的板子题。求解有很多可以进一步优化的方法。复杂度从n2n^2n2可以降为n(n)n\sqrt(n)n(n),采用埃氏筛的算法可以降为nlgnlgnnlgnlgnnlgnlgn, 如果更进一步还可以采用线性筛的方法最快可以达到nnn.--------------朴素做法------------在判断的时候只需要判断小的那一半是不是因子就可。class Solution { public原创 2021-01-10 22:21:00 · 313 阅读 · 0 评论 -
【每日一题】2020.11月每日刷题总结
文章目录140.单词拆分II (dfs,dp)57.插入区间(判断区间重叠的标准)本专栏主要的针对每日一题的更新,会总结一些比较好的每日一题。140.单词拆分II (dfs,dp)class Solution { public List<String> wordBreak(String s, List<String> wordDict) { // 在整体的思路上,需要首先维护一个dp[i]表示第i位之前的内容全部都是可以在字典中的。这里不包括第i位。原创 2020-12-07 23:04:36 · 321 阅读 · 0 评论 -
【每日一题】9.24-10.08 秋叶收藏集(分类dp),二叉树的后序遍历,树中最小遍历之和(树形Dp)
文章目录LCP 19. 秋叶收藏集834. 树中距离之和145. 二叉树的后序遍历LCP 19. 秋叶收藏集有点分情况讨论Dp的意思,对于dp问题我们还是需要分两步分析,首先分析子问题是什么。我们最终的结果是长度为n的树叶中,得到上下上的形式。这个问题可以变为子问题。在长度为n-1的树叶集得到 1. 上下上/上下,这样最后一个只需要保证变为上;这样我们考虑第n-1片叶子,如果n-1是上下上,则n-2需要是 上下或者上下上;如果n-1是上下,则n-2需要是 上上或者上下。因此实际上由三个大的状态:上原创 2020-10-08 22:34:42 · 129 阅读 · 0 评论 -
【每日一题】9.13-9.23 冗余调度II,监控二叉树
文章目录685.冗余调度II968. 监控二叉树685.冗余调度II是一道图论的题目,冗余连接存在两种,一种是没有入读为2的情况,但是最终成环,一种是某个节点的入读为2;第一种情况:我们只需要利用并查集检查连通性,如果检查到连接的两个点其实已经连通,就记录,记为cycle。到最后没有出现入读为2的边的话,就删除。否则看情况2.第二种情况:首先我们记录下添加边以后某点入读为2的该条边是什么,记为conflit,对应的另外一个记为edge[node],此时先不连接conflit这条边。然后分两个情况原创 2020-09-23 21:11:08 · 184 阅读 · 0 评论 -
【每周N题】8.30-9.12 堆的使用,回溯问题,最大最小问题
文章目录347. 前 K 个高频元素347. 前 K 个高频元素class Solution { public int[] topKFrequent(int[] nums, int k) { // 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值 HashMap<Integer,Integer> map = new HashMap(); for(int num : nums){ if (map.co原创 2020-09-07 10:18:08 · 115 阅读 · 0 评论 -
【每周n题】字符串哈希,欧拉图算法,24点回溯
终于还是开学了,还是坚持每日一t的节奏,只是更新可能不是很及时了文章目录最短回文串332.重新安排形程最短回文串暴力的算法就是进行枚举,找到从头开始最长的一个回文字符串。然后反转后缀添加上去。这里主要注意一下语言:s.substring(begin, end) 截取字符串new StringBuilder(s.substring(sh)).reverse().append(s).toString();熟练使用StringBufferclass Solution { public原创 2020-08-29 16:52:16 · 174 阅读 · 0 评论 -
【每周N题】回文对,恢复二叉搜索树,克隆图,移除盒子
截至2020/08/20文章的主题还是分为学习算法和学习Java两个部分。由于一些题目都是老题,因此主要学习思路和Java写法。文章目录336.回文对 H99.恢复二叉搜索树 H133.克隆图546.移出盒子 H336.回文对 H这道题目是比较难的,官方题解也给的比较清楚,这里我们辅助注释理解就可以。Java方法:map.getOrDefault(a, -1);,在字典中查找a,如果找到返回值,否则返回-1;String s = new StringBuffer(words[i]).re原创 2020-08-21 00:47:09 · 158 阅读 · 0 评论 -
【每日一题】最小区间等
2020/08/04标注了困难的题目是需要学习方法的,其余的主要是学习java。文章目录1.Tues. 课程表2. Mon. 字符串相加3. Sun. 二叉树转为链表4. Sat. 最小区间(hard)5. 寻宝(困难)1.Tues. 课程表一道极其典型的拓扑排序题目,比较推荐的方法就是采用维护一个入度矩阵,采用BFS的方法。这里只写Java方法。class Solution { public boolean canFinish(int numCourses, int[][] prere原创 2020-08-04 12:18:49 · 273 阅读 · 0 评论 -
【每日一题】分割数组的最大值,矩阵最长递增路径,不同的二叉搜索树
由于刷题也比较多了,现在开始每周二总结一下上周的每日一题的比较不错的题目。并且由于打算转后端,会附上java的代码。文章目录1. 410分割数组的最大值(最大化最小值)2. 329矩阵最长递增路径3. 95不同的二叉搜索树java 无sum函数java 中先进先出队列的实现Queue<int[]> queue = new LinkedList<int []>()queue.offer(new int[] {x,y})判断是否空队列!queue.isEmpty()len原创 2020-07-28 18:07:50 · 130 阅读 · 0 评论 -
【每日一题】模式匹配
2020/06/22题目要求比较明确,重点在于只有a,b两个情况,因此我们可以分别列举就可以。每次确定a对应的字符串的长度,枚举即可。注意有一个小的技巧在于,每次选择a,b中比较大的那个为a,同时记着修改pattern串,这样的好处是避免a=0带来麻烦。在第一次进行赋值时候,我们首先把空串设置为了None,这样可以用一个判断很好的判断是进行赋值还是比较。class Solution: def patternMatching(self, pattern: str, value: str) -原创 2020-06-22 11:56:25 · 222 阅读 · 0 评论 -
【每日一同】先序遍历还原二叉树
又是一道二叉树的题目,核心还是想清楚递归和迭代的问题。之前我们做过还原二叉树的题目,那道题目的是给出了中序遍历和前(后)序遍历,实现还原。简单复习一下那道题目的思想。原创 2020-06-18 15:17:37 · 125 阅读 · 0 评论 -
【每日一题+经典】单词接龙II——通配符+bfs+dfs ++ 双向bfs
2020/06/07 返回搜索路径的BFS是一道典型的bfs题目,其实可以用回溯方法,但是复杂度太高。难点在于如何降低复杂度。首先是通配符的方法,构建了一个字典,键是通配符,对一个的值是所以符合这个通配符的单词。其次是结合了bfs和dfs的方法,bfs保证了找到最短的路径,同时在bfs中构建了一个后继字典,这样在dfs中可以方便的得到路径。后继字典的构建保证了不会有绕远的路径出现,因为有visited数组。from collections import defaultdictfrom coll原创 2020-06-08 17:57:02 · 193 阅读 · 0 评论 -
【每日一题】新21点——概率题目
2020/06/03 一道穿了概率外衣的dp问题思路核心在于如何理解题意,这个概率是如何计算得到的。有两种思路,第一种思路从前往后进行推导,但是我没成功。暂且不表。主要讲一下比较好的第二种思路。既然是一道概率题,我们首先把游戏结束时的成功的事件设置为1。成功事件是指,最后结果大于等于K且小于等于N的事件,与之相应的失败时间是最后结果大于N。由于最后的状态只与前一个状态有关,因此我们设置状态dp[i]表示当前数值为i时,成功的概率。显然dp[K: min(N,K+W)+1] = 1,其余状态都初始原创 2020-06-03 15:12:05 · 943 阅读 · 0 评论 -
【leetcode经典题目】寻找两个正序数组的中位数
第4题,难度hard,思想方法是很巧妙的一种二分思想,但是不是严格意义的二分法。如果不考虑时间复杂度,可以维护一个采用双指针的方法,分别从两个数组的头开始查找,然后找到k大的数字,时间复杂度是O(n+m)O(n+m)O(n+m)但是这里限制了时间复杂度是lg级别的,因此很自然的想到采用二分的策略。进一步解释,每次我们分别对两个数组进行查找,找到的两个target中小的那个必然是不满足的,因为小于这个数字的只有k−2k-2k−2个,算上自身也只有k−1k-1k−1。我们删除这些数字(或者坐标进行偏移原创 2020-05-24 17:52:17 · 385 阅读 · 0 评论 -
【每日一题】从前序与中序遍历序列构造二叉树
2020/05/23 每日一题经典的二叉树问题,需要重点理解好三种排序算法之间的区别。核心是利用好中序遍历作为标杆前序遍历 [3 9 15 20 7]中序遍历 [9 3 15 20 7]后序遍历 [9 15 7 20 3]最特殊的就是中序遍历算法,每一个根节点的两侧的数据都是两棵子树的数据。因此可以作为标杆使用。我们结合题目来分析。迭代方法主要分析迭代的方法。步骤:放入根节点,这里是前序遍历的第一个数字;维护一个index,这里是从0开始,index对应中序遍历。开始根据前序遍历原创 2020-05-23 15:52:19 · 268 阅读 · 0 评论 -
【每日一题】课程表ii——图的拓扑排序
2020/05/17 每日一题是一个图的拓扑排序问题,需要将限制性条件进行优先满足。有两种基本的思路。一种是采用BFS的方法,这中方法是统计了每个节点的入度,只有当入度为0时,才加入改节点。需要设计字典以pre为键,cur为值。class Solution: def findOrder(self, n: int, prerequisites: List[List[int]]) -> List[int]: dic = collections.defaultdict(li原创 2020-05-17 16:18:33 · 176 阅读 · 0 评论 -
【每日一题】最大正方形面积——进阶,矩形面积
2020/05/08 每日一题221 最大正方形面积是一道做过的题目出现在了每日一题,今后的每日一题我尽量把相关的题目都写一遍。这道题目的思路并不是看到01矩阵就采用暴力的bfs方法,而是可以采用dp的思想。因为正方形具有不错的性质可以采用保存边长的方法,最后计算面积。核心dp:dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1...原创 2020-05-08 17:12:02 · 676 阅读 · 0 评论 -
【每日一题】最低票价——dp问题
2020/05/06每日一题找清楚子问题是什么,如何得到子问题下的解dp思路的题目,典型特点在于寻找子问题的推导方法。对于这个题目子问题就是,days较少的时候,每次多增加一天都可以视为是新的dp。状态:dp[i]第i天的花费,这里需要注意i天是实际的第i天。因此这一天可能需要出去旅游,也可能不需要旅游。状态转移:考虑这一天是够需要出门旅游,如果需要,dp[i] = min(dp[i-...原创 2020-05-06 15:15:43 · 232 阅读 · 0 评论 -
【每日一题】合并K个排序链表
2020.04.26一道也是可以利用归并思想解决的题目。只是要在子函数想清楚,每次都要对链表操作。class Solution: def mergeKLists(self, lists: List[ListNode]) -> ListNode: if not lists: return return self.divid...原创 2020-04-26 12:20:06 · 121 阅读 · 0 评论 -
【每日一题】数组中的逆序对
2020.04.24是一道难度为Hard的题目,主要原因是数据率较大。因此需要算法进行优化。如果是暴力的方法复杂度是O(n2)O(n^2)O(n2)无法解决。因此这道题很巧妙的运用了归并排序的一些思想来解决。主要思想是,首先将数组按照归并排序进行分解。在每次进行合并的时候,判断左侧数组是否大于右侧数组,如果是则找到了逆序数,并且左侧数组后面的所有数字页都大于当前的右侧数组的头元素。利用归并...原创 2020-04-25 23:57:16 · 154 阅读 · 0 评论 -
【每日一题】335 设计推特
2020.04.13是一道系统设计类题目。利用数据结构实现功能。基本的设计框架如下,有一个列表存放目前所有的推文,包括了发送人和推文内容。另外需要维护一个字典,字典的键是每个人的id,存储的值是一个集合,包括了关注的朋友。每次获取推文,需要按照发布的新旧程度查找符合关注列表的。class Twitter: def __init__(self): """ ...原创 2020-04-13 17:54:41 · 129 阅读 · 0 评论 -
【每日一题】面试题 16.03. 两线段求交点 (py3真香)
2020.04.12一道面向数学的编程题目。对于一些数学问题的编程算法可以有进一步的理解。本题主要是区分4种情况:两条斜率都不存在,即与y轴平行其中一条斜率不存在直线1是垂线,直线2不是直线2是垂线,直线1不是两条都不是垂线斜率相同,且截距相同并有交点斜率不同,先算出交点,再看交点是否均在两条线段之间基本方法:判断线段有无交点的经典写法。max(start...原创 2020-04-12 14:51:13 · 177 阅读 · 0 评论 -
【每日一题】高楼扔鸡蛋
2020.04.11这题其实正常思路还可以,有点类似b站李永乐老师讲的方法。核心还是寻找子问题,dp[i][j]表示一共有i层j个鸡蛋。可以把dp[i][j]分为先在第m层扔一次,在剩下的结果里继续分析。dp[i][j] = min(dp[i][j], max(dp[m][j-1], dp[N-m][j]))第一个min对应最优解,第二个max表示最差的情况。这么分析的话复杂度为O(KN2...原创 2020-04-11 15:21:25 · 220 阅读 · 0 评论 -
【每日一题】151. 翻转字符串里的单词
2020.04.10151. 翻转字符串里的单词一道字符串操作题目,借助这道题目学习几个python常用函数。首先给出这道题目在python下的简单代码。class Solution(object): def reverseWords(self, s): temp = s.split() return ' '.join(temp[::-1])函数...原创 2020-04-10 13:05:48 · 129 阅读 · 0 评论 -
【每日一题】460.LFU缓存
2020.04.05今天的题目是一道设计类的题目。和146题LRU缓存机制很类似。并且在解题的设计思路上我确实借鉴了设计思路。这一类的题目难点都是在存储机制存储满以后如何实现在O(1)O(1)O(1)的时间复杂度里面删除元素。LRU删除元素的操作顺序是删除最久没有使用的,因此采用链表的形式,每次删除头节点就可以。LFU是删除频次最低的,同频次下删除最久没使用的,因此我们需要得到最低频次的数...原创 2020-04-06 23:28:00 · 162 阅读 · 0 评论 -
【每日一题】8 字符串准换整形(正则化表达式)
正则化练习!class Solution(object): def myAtoi(self, str): """ :type str: str :rtype: int """ INT_MAX = (1<<31)-1 #2147483647 INT_MIN = -(1&...原创 2020-04-03 23:09:58 · 170 阅读 · 0 评论 -
【每日一题】289生命游戏(卷积练习)
元胞自动机如果用卷积的思想考虑其实还是很不错的。卷积得话对于矩阵的操作首先就要用到numpy库。因此也可以作为一道numpy库的练习题目。import numpy as npclass Solution(object): def gameOfLife(self, board): """ :type board: List[List[int]] ...原创 2020-04-02 12:23:36 · 273 阅读 · 0 评论 -
【每日一题】912 数组排序
2020.03.31朴实无华的,还能更朴实无华么??首先放上整理。正常的排序都是O(nlogn)O(nlogn)O(nlogn)这一数量级上,也就是我们常说的比较排序的上限。对于桶排序是空间换时间,可以达到O(n)O(n)O(n),并且需要是整数。稳定性算法:冒泡,插入,归并,奇数,桶,基数不稳:快排等代码就是写了归并和快排,都是用到了DC思想。class Solution(obj...原创 2020-03-31 15:12:16 · 125 阅读 · 0 评论 -
【每日一题】面试题62 画圈中最后剩下的数字(约瑟夫问题)
约瑟夫问题题目竟然还是简单的,但是受限于复杂度,没办法用常规方法解答。因此引入了一个具有dp思想的约瑟夫问题。具体的解法是一个数学问题,我就直接放图了。思想是将大问题化为了子问题,从底至上的解决。class Solution(object): def lastRemaining(self, n, m): """ :type n: int ...原创 2020-03-30 11:28:34 · 191 阅读 · 0 评论 -
【每日一题】1162 地图分析(BFS,,前后两次dp)
2020.03.29首先看到题目就能想到这是一道BFS题目(其实开始想到用动态规划)因为对bfs的题目套路不是很熟悉没有ac。BFS题目思路:BFS使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS总共有两个模板:如果不需要确定当前遍历到了哪一层,BFS模板如下。while queue 不空: cur = queue.pop() ...原创 2020-03-29 15:51:34 · 245 阅读 · 0 评论 -
【每日一题】820 单词压缩编码
2020.3.28 题目难度: medium题目是字符串处理类。首次未做出。思路分为两种,一种是使用排序的方法,检索单词的后缀是否相同。另外一种是采用字符树。这里主要介绍排序的方法:class Solution(object): def minimumLengthEncoding(self, words): """ :type words: List...原创 2020-03-28 11:46:50 · 135 阅读 · 0 评论 -
【每日一题】941 卡牌分组
新开了一个系列,主要记录在刷每日一题的时候学到的内容。2020.03.27题目猛以看还是挺唬人的,如果暴力破解复杂度O(n∗n)O(n*n)O(n∗n).首先毫无疑问是要统计每个数字出现的次数的。其次在知道了每个数字出现的次数以后,我们需要找到所有次数的最大公因数。因此题目其实是可以当成两个子问题来解决的。class Solution(object): def hasGroup...原创 2020-03-27 19:57:42 · 224 阅读 · 0 评论