LeetCode
脱水星球
这个作者很懒,什么都没留下…
展开
-
[Python] [LeetCode] [每日一题] 1011. 在D天内送达包裹的能力
题意: 有一艘货轮在D天内往返于A B港口运送货物,货物重量的序列为weights(不可改变顺序),求一个最小的货轮载重能力,使得货轮能够在D天内运送完所有货物。 思路: 第一反应是二分答案,因为载重能力越强,所需时间越少。考虑是否能O(n)检查答案。对于货物x,假如可以在当天装上货轮,那么留到第二天装上货轮一定不比当天装货优,因此直接扫描序列,每一天尽可能装更多的货物,检查D天内是否能装完。复杂度O(nlog(n*weight)) class Solution: def shipWithinDay原创 2021-04-26 19:20:11 · 181 阅读 · 0 评论 -
[Python] [LeetCode] 146. LRU 缓存机制
双向链表+哈希表 这个设计题蛮有意思的,学到了很多 最近访问的放在前,许久未访问的放在后,同时支持动态空间、末尾删除,顶端插入。第一时间想到双向链表。但是链表不支持O(1)查询,因此加一个哈希表。 双向链表 指针指向自己代表null,这样的话delete和insert操作就不必判空 重载__repr__方便输出调试 LRU 支持 get put 方法 get() 使用哈希表取得目标节点的指针,返回键值。同时删除被访问节点并插入表头。 O(1) put() 先判断是否已经存在于表中,如在表中则修改键值并删除节原创 2021-04-13 19:25:14 · 97 阅读 · 0 评论 -
[Python] [LeetCode] 22. 括号生成 最优美的暴力
我也不知道该怎么形容,我见过最优美而简洁的搜索方法。 这就是暴力美学吧。 不用额外的剪枝,直接通过状态上的定义就可以去重。 至于为什么要这么定义,我们分析以下状态: 假设我们现在有一个有效的括号序列s[n-1],该括号序列有n-1对括号,要生成具有n+1对括号的有效序列,我们只能合法的加上一对括号,具体来说有三种情况:(s[n-1]) s[n-1]() ()s[n-1] 这三种情况都可以被以下格式概括: (s[n-1])s[0] (s[n-2])() ()s[n-1] 其余的解释我只能想到排除法: 介于递推原创 2021-04-11 23:27:33 · 123 阅读 · 0 评论 -
[Python] [LeetCode] 456. 132模式
单调队列变体 注意到132模式中32为时序上有序,联想到单调队列 由于枚举1的时候需已经计算过32,因此反向遍历 靠近1的要足够高,因此维护从栈底到栈顶的单增序列 加入任意元素至栈中时,弹出小于它的元素。此时可以将弹出的元素看做2,当前的元素看做3,只要是被弹出的元素,必定是被一个更大的元素所弹出,切该元素必定在被弹出元素的前方。因此仅需判断所有被弹出的元素中的最大值是否大于当前枚举的元素即可 class Solution: def find132pattern(self, nums: List[i原创 2021-04-11 22:46:43 · 99 阅读 · 0 评论 -
[Python] [LeetCode] 1458. 两个子序列的最大点积 双百
设dp[i][j]为nums1的前i位和nums2的前j位中取出的等长子序列的最大点积。 假设新加入nums1[i]和nums2[j]至子序列,则: dp[i][j] = dp[i-1][j-1] + nums1[i] * nums2[j](乘积可能为负) 假设不加入任何数,则: dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) 发现转移方程仅与i-1有关,可以节省空间 class Solution: def maxDotProduct(s.原创 2021-04-11 22:31:02 · 114 阅读 · 0 评论 -
[Python] [LeetCode] 338. 比特位计数
经典递推 设f[num]为当前数字含有的二进制1的个数 如果当前数为奇数,则二进制末尾为1,f[num]=f[num>>1] + 1 如果当前数为偶数,则二进制末尾为0,f[num]=f[num>>1] class Solution: def countBits(self, num: int) -> List[int]: ans = [0] for i in range(1, num + 1): ans.appen原创 2021-04-11 21:55:01 · 103 阅读 · 0 评论 -
[Python] [LeetCode] 剑指 Offer 52. 链表的公共节点
被秀到了 判断两链表是否有交点,有则输出交点,无则输出 null 这道题解法很多,最简洁的解法为: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def getIntersectionNode(self, headA: ListNode, head原创 2021-04-10 16:50:37 · 108 阅读 · 0 评论 -
[Python] [LeetCode] 剑指Offer 65. 不用加减乘除做加法 (Python负数存储原理)
基本思路 写出真值表,^得到当前位运算后结果,&得到进位,考虑到进位会进一步引发进位,要while循环至进位为0。 由于每一位的操作相同,每次直接整体操作,无需按位操作。 注意的点 Python中的负数以补码形式储存,这就意味着其高位有无穷个1。此题限制在32位有符号整数的语境中,因此开头先用0x7FFFFFFFF获取0 ~ 32位,运算后判断是否为负数,如果为负数则需补齐高位的所有1。补齐方法:直接用 ~ 会将运算结果也取反,因此先对0 ~ 32位取反,再全部取反,相当于对32位之后全部取反。 妙原创 2021-04-10 14:58:21 · 107 阅读 · 0 评论