Leetcode
文章平均质量分 56
MYSDB
刷题专用blog
展开
-
【LeetCode】2015. Average Height of Buildings in Each Segment 每段建筑物的平均高度
扫描线(Sweep Line)算法。从左到右遍历每个出现过的坐标(不管是作为building起始还是结束)。关键思想是:永远维护一个[cur_s, x)的平均高度before(初始时假设为None)处理坐标x处的所有出点和入点(顺序无关),得到处理之后的平均高度after如果处理之后,平均高度发生了变化,那么就把[cur_s, x, before]加进去实现扫描线可以用哈希数组或者堆。heapfrom heapq import heappush, heappopclass Sol...原创 2022-05-23 14:01:54 · 310 阅读 · 0 评论 -
【LeetCode】2250. Count Number of Rectangles Containing Each Point
基本上就是Binary Search简单二分因为题目的height只有100种可能,我的naive的想法是统计每个height的width,然后遍历到每个点(x, y)的时候,把height>=y的每个width数组都二分查找一遍……from collections import defaultdictfrom bisect import bisect_leftclass Solution: def countRectangles(self, rectangles: List...原创 2022-05-23 11:38:17 · 212 阅读 · 0 评论 -
【LeetCode】1483. Kth Ancestor of a Tree Node 1483. 树节点的第 K 个祖先
由于O(N^2)的存储会超内存限制,所以直接记忆化肯定凉了。只能考虑O(NlogN)的存储,方法就对每个node都记下,它k=1,2,4,8,…时候的k祖先。比如,可以用f[h][node]表示node的2**h祖先是谁。需要注意的是,记这个的时候也得做一些优化,直接暴力遍历还是会超时。原理就是:node的2h2^h2h距离的祖先就是它2h−12^{h-1}2h−1祖先的2h−12^{h-1}2h−1祖先,f[h][node] = f[h-1][f[h-1][node]]。然后在query的时候,.原创 2022-05-17 08:09:18 · 243 阅读 · 0 评论 -
【LeetCode】569. Median Employee Salary 员工薪水中位数
第一次做到SQL的题。window functionselect id, company, salaryfrom ( select *, (count(salary) over (partition by company)) / 2.0 as cnt, row_number() over (partition by company order by salary) as rk from Employee) t..原创 2022-05-17 04:25:38 · 272 阅读 · 0 评论 -
【LeetCode】471. Encode String with Shortest Length 编码最短长度的字符串
题解这题其实分成了两个部分:DP:把大问题分割成小问题判断循环节:这样才能知道某段字符串可不可以缩DP/问题切割给定一段字符串s,如果存在某个中间位置k,把字符串分割成2部分s[:k]和s[k:]:如果s[:k]由循环节组成,假设已知它可以缩成substr,那么问题就变成了F(s)=substr+F(s[k:])F(s) = \text{substr} + F(s[k:])F(s)=substr+F(s[k:])类似地,如果s[k:]由循环节组成,同样假设它可以被缩成substr,那么.原创 2022-05-17 02:41:57 · 334 阅读 · 0 评论 -
【LeetCode】1655. Distribute Repeating Integers 分配重复整数
一题多解。首先理解问题,可以抽象为:有若干物品,大小分别为quantity[i]。假如某个数字重复x次,可理解为有一个容量为x的背包要把物品放进背包里,问能不能放完DFS暴力解法,直接遍历所有可能,甚至也没有怎么剪枝,竟然也不超时……class Solution: def canDistribute(self, nums: List[int], quantity: List[int]) -> bool: packages = list(sorted(Coun.原创 2022-05-16 12:28:58 · 195 阅读 · 0 评论 -
【LeetCode】1580. Put Boxes Into the Warehouse II 把箱子放进仓库里 II
简单贪心。因为题目的规则,很容易可以想到不管从左边还是从右边塞入,warehouse的容量肯定是一直递减的。所以很明显,最高的box如果从左边第一个,或者右边第一个开始就塞不进了,那么它就永远不可能塞进了。而如果它可以塞进去,那么塞进左边第一个(或右边第一个)会是最优的吗?是的。因为假设左边第一个位置不塞这个最高的,塞了次高的,那么由于后面的warehouse容量更小了,在最好的情况下也只能把最后的n-2个塞完,最高的这个永远塞不进去。所以:不塞这个最高的box不可能导致更差的结果。那么...原创 2022-05-15 09:06:07 · 256 阅读 · 0 评论 -
【LeetCode】1654. Minimum Jumps to Reach Home 到家的最少跳跃次数
BFS.坑:因为不能后跳2次,通过-b往回跳的点,依然可以试图利用+a走一次。因为通过+a走到的点既能前跳又能后跳,不用再遍历了;而通过-b走到的点只能前跳,所以可能的情况下还是要通过+a走一次探索一下后跳的可能性。由于坐标一定是非负的,这里我用负数来表示某坐标是通过后跳走到的,这样就和前跳分开记录visited了。可以把visited和forbid用一个set记录由于x轴无限长,有可能无限尝试都得不到-1,尤其是在a<b的情况下。在a>b的情况下容易证明最远走x+b就可以了。而a&.原创 2022-05-11 07:41:31 · 307 阅读 · 0 评论 -
【LeetCode】1353. Maximum Number of Events That Can Be Attended 最多可以参加的会议数目
明显的贪心,把区间从小到大排序之后,发生的越早的、持续时间越短的会议越优先参加。需要记录一下当前available的最早的天数(cur_s)。比如:[1, 2], [1, 4], [2, 2], [3, 3], [5, 6]的情况我们决定在第一天参加[1, 2]之后,cur_s就变成了2。需要注意的是: 这时候在第2天才开始的会议就要加在一起讨论了!而那些在第1天开始的会议已经等价于在第2天才开始了(因为第1天已经被用了),也就是说,我们需要比较[2, 4](原[1, 4])和[2, 2]参加哪..原创 2022-05-11 03:30:38 · 146 阅读 · 0 评论 -
【LeetCode】1901. Find a Peak Element II 找出顶峰元素 II
题目形容得很形象了,其实只要从任意一点出发,沿元素变大的方向走,走到再也走不了的时候,就遇到了峰值。如果我们当前在某行的最大值处:* 如果同一列的下面那行比它大,也就是说往下能继续找到峰顶* 吃果同一列的上面那行比它大,也就是说往上继续能找到峰顶* 都不是,那么当前点就是峰顶因此我们可以对行进行二分:class Solution: def findPeakGrid(self, mat: List[List[int]]) -> List[int]: M = len..原创 2022-05-10 13:47:00 · 411 阅读 · 0 评论 -
166. Fraction to Recurring Decimal
解法犯傻的一题结果只可能是有限小数和无限循环小数列竖式算下就知道了,当余数重复的时候就是循环开始的时候注意下标之间的对应坑:符号还是单独处理比较好class Solution(object): def fractionToDecimal(self, numerator, denominator): """ :type numerator: int...原创 2018-12-05 22:21:59 · 110 阅读 · 0 评论 -
44. Wildcard Matching
解法完全是考虑细心和剪枝假设连续的*都被压缩成了一个中心思想是,?和普通字符的匹配没问题,但是*的匹配可以如下快进处理:假设目前匹配到s[i]和p[j],其中p[j]为*,s上的下一个匹配位点至少从s[i+1]以后的第一个和p[j+1]相同的字符开始为了加速匹配,可以把p按字符*分开成若干个普通字符组patterns它们总的长度为字符串最小需要的长度patterns[0]必须完全跟...原创 2018-12-08 23:54:02 · 84 阅读 · 0 评论 -
837. New 21 Game
解法数学题,思路没啥问题,统计每个点数可能出现的概率,最后算K到N之间的概率之和就行每次单独求和会超时,所以要和用增量式的方法求class Solution(object): def new21Game(self, N, K, W): """ :type N: int :type K: int :type W: int...原创 2018-12-06 11:25:33 · 158 阅读 · 0 评论 -
621. Task Scheduler
解法很有意思的一道题,思路大概是:贪心:频率越大的任务先放,会造成maxfreq-1个长度至少为n的间隙,剩下的内容依次往间隙里填,填不够就只能idle了我想到了上一步,但是接下来才是巧思的地方:假如没有填满,最长的长度显然由maxfreq决定假如填满了,长度就由任务列表的长度决定了:比如说,ABCABCAB,这时候假如有一个长为2的D,显然增加某些区间的间隔为n+1就可以办到了,...原创 2018-12-06 13:20:02 · 97 阅读 · 0 评论 -
815. Bus Routes
参考:https://blog.csdn.net/ww32zz/article/details/50755225这题主要是用BFS, 我一开始用的最短路径算法, TLE辽= =BFS不用说了,到处都是class Solution(object): def numBusesToDestination(self, routes, S, T): """ ...原创 2018-12-13 18:37:00 · 222 阅读 · 0 评论 -
493. Reverse Pairs
参考:https://www.jianshu.com/p/b661d3e802f9数组类问题两种思路:思路一:T(i,j)=T(i,j−1)+CT(i,j) = T(i,j-1)+CT(i,j)=T(i,j−1)+C思路二:T(i,j)=T(i,m)+T(m,j)+CT(i,j) = T(i,m)+T(m,j)+CT(i,j)=T(i,m)+T(m,j)+C解法一:BST使用思路一,...原创 2018-12-06 16:45:36 · 170 阅读 · 0 评论 -
273. Integer to English Words
解法难倒是不难,考验细心坑:单词不要拼错10~19的注意挑出来0的处理class Solution(object): def numberToWords(self, num): """ :type num: int :rtype: str """ BILLION = 1000000000 ...原创 2018-12-06 17:30:26 · 131 阅读 · 0 评论 -
906. Super Palindromes
解法参考:https://zhanghuimeng.github.io/post/leetcode-906-super-palindromes/思路:为了减小时间复杂度,[1,1018],开方到[1,109]穷举,再由[1,10^4.5]内的数对称而得class Solution(object): def superpalindromesInRange(self, L, R):...原创 2018-12-06 23:40:37 · 150 阅读 · 0 评论 -
395. Longest Substring with At Least K Repeating Characters
解法分治,想到了出现小于k的怎么分,脑子一卡没想到没出现怎么办,傻孩子,没出现整个字符串就符合条件呀!class Solution(object): def longestSubstring(self, s, k): """ :type s: str :type k: int :rtype: int """...原创 2018-12-09 20:45:06 · 85 阅读 · 0 评论 -
948. Bag of Tokens
解法贪心法,存的时候存最小的,减的时候减最大的先存到不能存,然后加能量,然后再存所有可以存的注意有可能有时候白换了,所以要统计历史最高得分class Solution(object): def bagOfTokensScore(self, tokens, P): """ :type tokens: List[int] :type P:...原创 2018-12-20 19:00:36 · 146 阅读 · 0 评论 -
932. Beautiful Array
解法记忆性递归很容易分析出来,只有当A[i]+A[j]为偶数的时候才存在“不漂亮”的可能,那么A[i]和A[j]必须同奇或同偶所以一个想法是把奇数和偶数分开来,然后只要奇数是漂亮数组,偶数也是漂亮数组就好了,到这一步都比较好想,然后我就卡住了递归思想寄托在第三步里 现在我有1…N,不妨假设N为偶数,那么,奇数那边分别是:1, 3, ..., N-1,偶数那边是2,4,6,...,N。令...原创 2018-12-20 19:50:12 · 269 阅读 · 0 评论 -
130. Surrounded Regions
解法边上的O一定不会被包围,所以跟它们相连的O也不会被包围class Solution(object): def solve(self, board): """ :type board: List[List[str]] :rtype: void Do not return anything, modify board in-place i...原创 2018-12-10 11:37:27 · 94 阅读 · 0 评论 -
491. Increasing Subsequences
解法DFS,每遍历到一个都是可行新子串,满足长度不小于2的就可以输出,然后再往后发展用set来去重class Solution(object): def findSubsequences(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """...转载 2018-12-10 11:41:04 · 158 阅读 · 0 评论 -
918. Maximum Sum Circular Subarray
解法解法LC上写得很详细了,大概概括一下吧。主要有2类算法,分类的原则是如何表示循环数组的子串,一种是A*2,第二种是2区间A*2遇到这种循环题,我的第一反应就是把拼两个A,得到新数组,这样问题转化为新数组的最大子串和问题最大子串和问题前面做过了,可以用两个前缀和相减来做:ans[j]=maxi,j(P[j]−P[i])ans[j] = \max_{i,j}(P[j]-P[i])ans...原创 2018-12-15 20:43:03 · 241 阅读 · 0 评论 -
438. Find All Anagrams in a String
解法滑动窗口+map,适合子串类问题维护滑动窗口的左指针lX和右指针r,初始l=r=0维护一个计数的映射 Counter,Counter[c]=i表示窗口[l,r]中还缺少多少个p中的字符,i<0表示不但不缺还多了维护一个diff参数:表示窗口包含的所有字母里是否已经包含了所有p里的len(p)个字符初始扩大右端点r,直到diff=0,这时候窗口肯定大于等于len§的长度。...原创 2018-12-26 18:10:37 · 101 阅读 · 0 评论 -
483. Smallest Good Base
解法参考:https://blog.csdn.net/qq_23997101/article/details/73135615数学推理题…………………………………………本质是找a和k,使得:n=1+a+a2+...+ak(k&gt;=1)n=1+a+a^2+...+a^k (k&gt;=1)n=1+a+a2+...+ak(k>=1)所以有:n&gt;ak⇒...原创 2018-12-10 17:10:36 · 141 阅读 · 0 评论 -
560. Subarray Sum Equals K
解法参考:https://blog.csdn.net/tstsugeg/article/details/71107676设s[i]为a的前缀和当算到s[i]的前缀和时,统计此时有多少个j使得s[j]=s[i]-k(也就是在算s[i]之前和s[i]-k的出现次数),这样,a[j+1]到a[i]的和就为k,累加到结果里class Solution(object): def suba...原创 2018-12-10 18:37:43 · 88 阅读 · 0 评论 -
839. Similar String Groups
解法中心思想是用并查集,关键点是联系的输入两种方法:枚举list里两两字符串之间的相系,适合词少的时候遍历每个字符,枚举它可能到达的字符,适合词多的时候假设字符串s可以到达t,注意这里是存的是t到s的边,因为set[i]要存i字符串可以到达的在list里的字符串的集合点:词稀疏和稠密适合不同的算法注意最后统计的时候同一个s不要统计2次标准答案里并查集用的是数组下标,我用的...原创 2018-12-10 19:38:44 · 175 阅读 · 0 评论 -
164. Maximum Gap
解法求排序后相邻数的差距的最小值,如果使用基于比较的排序绝对是O(nlogn)O(nlogn)O(nlogn)的。所以要考虑O(n)O(n)O(n)的排序算法:计数排序、基数排序和桶排序由于数字出现的范围是0~0x7fffffff,所以直接计数排序不行,从后两个上面考虑解法一:基数排序每次基数排序的时候可以使用计数排序【……嗯没错官解用的是计数排序class Solution(obje...原创 2018-12-27 13:39:41 · 186 阅读 · 0 评论 -
719. Find K-th Smallest Pair Distance
解法主要思想是二分法先给数组排序,这样答案一定在0和最大差距nums[-1]-nums[0]之间然后要解决的是二分查找中的判断函数问题,如何判断什么时候往左边找什么时候往右边找,在这个问题中,显然当差距小于等于mid的点对的个数大于等于k个的时候要向左找如何判断【差距小于等于mid的点对的个数大于等于k个】呢?采用尺取法,尺取法的使用条件为:(1)单调性,即当某端点固定时,另一端点从左向...原创 2018-12-17 01:12:15 · 216 阅读 · 0 评论 -
871. Minimum Number of Refueling Stops
解法还是不到家,两个思路都想到了但是一个浪费空间一个没想透彻= =解法一:DP肯定不能把油量作为dp的下标,所以我们考虑dp[i][j],表示到达车站i,加了j次油时剩余的最大油量。注意,我们考虑的是在车站i-1加不加油。令车站i和车站i-1之间的距离为dis假如不加油,那么到达车站i时候的最大油量为:dp[i-1][j]-dis假如加油,那么到达车站i时候的最大油量为:max(-1...原创 2018-12-27 16:37:11 · 109 阅读 · 0 评论 -
218. The Skyline Problem
解法一开始打算加一个建筑改一次,果然肯定是错的观察图可以发现,假设这个图是从左向右推进的,坐标为iii的时候的高度H(i)H(i)H(i)为:还未结束的矩形的高度的最大值,这个还未结束包括从i开始的矩形,不包括从i结束的矩形。什么时候把点加到答案里呢?观察可发现,点只可能出现在矩形的边界位置,且当H(i)!=H(i−1)H(i)!=H(i-1)H(i)!=H(i−1)的时候,需要加入一个[i...原创 2018-12-17 11:52:37 · 95 阅读 · 0 评论 -
664. Strange Printer
解法区间DP如何计算DP[i,j]呢?假设存在s[i]==s[k],那么对于任何i<k<=j:打印出字符串s[i:k-1]的最优步骤里,打印s[i]的那一步一定可以移到第一步,因为其它步骤就算在这一步前打印了也不会覆盖掉s[i],因为它是第一个。那么我们把打印s[i]的那一步一直打到s[k],然后让其它最优步骤正常覆盖s[i+1:k-1]就可以了。所以状态转移方程为:dp[...原创 2018-12-17 13:55:56 · 119 阅读 · 0 评论 -
310. Minimum Height Trees
解法方法是从叶子开始删除点,一直删到最后只剩下一个或两个点为止。为什么是1个或2个呢?首先,1个就不用解释了,当剩下2个点的时候,它们都是叶子节点,再删就空了,所以它们两个都可以作为根,得到的最小树高是一样的。当删剩下2个以上节点的时候,由于剩下的图也一定是个无向树图,所以一定能删得剩下1个或2个节点。class Solution(object): def findMinHeig...原创 2018-12-17 17:29:32 · 141 阅读 · 0 评论 -
887. Super Egg Drop
解法不是解法的生产者,只是官方解法的搬运工= =官方解法:https://leetcode.com/problems/super-egg-drop/solution/总共有两大类解法,一种是基于常规DP/递归思路的,把问题不断拆成子问题;另一种是反其道行之,考虑在K个鸡蛋的情况下,t次操作最多能在多少层楼的情况下确定F,找到最小的t即可基于DP/递归我们假设给定K,N的时候的解为T(...原创 2018-12-23 19:20:37 · 458 阅读 · 0 评论 -
239. Sliding Window Maximum
解法开始只想到了只有最大值右边的值有用,因为只要最大值在滑动窗口里的时候,它左边的值永远不会成为最大值其实再发散一下:-> 最大值左边的值没用 + 最大值左边的值一定比它小-> 第i大的值的左边比它小的值都没用,因为第i大的值在滑动窗口里的时候,它左边的值永远不会成为第i大的值所以维护一个双向队列,队列里存的是下标,队头对应的元素永远是最大的,当它超出窗口的范围时,把队...原创 2018-12-12 13:36:57 · 79 阅读 · 0 评论 -
691. Stickers to Spell Word
解法状态压缩DP,从题目条件可以知道target的长度不超过15,所以可以用整数来表示target的哪一位已经被贴纸满足了。状态state1只可能从比它小的数值state2转化过来,因为state1必然是由state2的某些位从0变1转化而来的所以DP的时候可以从小到大进行,假如遍历到state的时候:dp[state]还是初始化的值,那么证明之前的状态都无法到达state,而之后的状态...原创 2018-12-24 00:15:38 · 316 阅读 · 0 评论 -
478. Generate Random Point in a Circle
解法解法一:基于几何概型随机生成一个在外接正方形里的点,如果不在圆里就重新生成class Solution(object): def __init__(self, radius, x_center, y_center): """ :type radius: float :type x_center: float :ty...原创 2019-01-03 18:50:43 · 130 阅读 · 0 评论 -
306. Additive Number
解法看得出来是搜索或者dp,但是没有头绪参考:https://blog.csdn.net/x_i_y_u_e/article/details/50724390中心思想是枚举前两个数,也就是分别枚举它们的长度肯定要剪枝,怎么剪要自己分析注意:第二个数可以比第一个数要短假设整个字符串长为nnn,第一个数长为iii,序列至少有3个数,第二个数至少长为1,它们的和至少长为iii,所以有...原创 2018-12-18 22:11:53 · 148 阅读 · 0 评论 -
440. K-th Smallest in Lexicographical Order
解法不会做,参考了这篇博文实际上代码很简短,只能理解一下了按上文参考文章说的,假设n为无穷大时,每个数字都可以表示成一个十叉树森林里的一个节点:比如,第0层根结点1下一层管着10-19,下二层管着100-199;第1层根结点10下管着100-109……以此类推。数字按字典序排列就是这个森林按先根遍历得到的序列。我们发现父结点x管着的下一层的所有子结点为:Children(x)=[10...转载 2018-12-19 01:35:45 · 183 阅读 · 0 评论