
优先队列/堆栈/指针
算法
dinosaurcity
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【9月打卡~Leetcode每日一题】502.IPO(难度:困难)
这道题不用考虑负收益问题,根据大根堆,每次取出收益最大的项目即可在上条操作的前提是,手头资金足够,因此可以不用一次性造出大根堆,每次根据手上的资金,将目前可接手的项目加入大根堆。时间复杂度O(nlogn + klogn)class Solution {public: int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) { .原创 2021-09-08 15:17:12 · 353 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】面试题 17.14. 最小K个数(难度:中等)
面试题 17.14. 最小K个数设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。方法一:快排取前k时间复杂度O(nlogn)方法二:遍历+二分查找+维护一个有序小数组【超时】时间复杂度O(nklogk)class Solution {public: vector<int> smallestK(vector<int>& arr, int k) { vector ret(arr.begin(), arr.begin() +原创 2021-09-03 10:42:18 · 176 阅读 · 0 评论 -
【3月打卡~Leetcode每日一题】331. 验证二叉树的前序序列化(难度:中等)
331. 验证二叉树的前序序列化思路:等价代换的想法,考虑叶子节点和其父节点,如果表述正确,则可以用一个叶子节点代替,即:图例中的右下角,6 # # 可以用 #代替,又由于是前序遍历,所以如果可以序列化的话,则可以用 数字 # #一直替换,到最后只剩一个根节点的 #,同理如果是中序遍历,则是 # 数字 # ,后序遍历则是 # # 数字使用堆栈进行消消乐即可class Solution: def isValidSerialization(self, preorder: str) -> b原创 2021-03-12 10:13:08 · 126 阅读 · 0 评论 -
【3月打卡~Leetcode每日一题】227. 基本计算器 II(难度:中等)
227. 基本计算器 II给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开同昨天,用栈的思想,不同的是,在处理连续的乘除时需要特判class Solution: def calculate(self, s: str) -> int: num,res,sign = 0,0,1 stack = [] for原创 2021-03-11 16:15:47 · 179 阅读 · 0 评论 -
【3月打卡~Leetcode每日一题】224. 基本计算器(难度:困难)
224. 基本计算器给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成用栈的思想,如果遇到括号,优先处理括号内的内容,将之前处理的内容储存到栈中class Solution: def calculate(self, s: str) -> int: res,num,sign = 0,0,1 stack = [] for c in s:原创 2021-03-11 16:10:38 · 277 阅读 · 0 评论 -
【2月打卡~Leetcode每日一题】424. 替换后的最长重复字符(难度:中等)
424. 替换后的最长重复字符给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度 和 k 不会超过 104。思路:双指针,维护两个数组,一个统计当前区域的字母频率,一个维护之前遍历过的区域的变化点,如果当前区域的字母频率不满足题意,则将左指针添加至第二个数组中维护的第一个变化点,直至右指针到末尾class Solution: def characterReplacem原创 2021-02-02 18:10:49 · 204 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】85. 最大矩形(难度:困难)
85. 最大矩形给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积.思路:该题思路其实是84题的升级版,只需将每行做处理,传递到84题的api即可,代码参考【12月打卡~Leetcode每日一题前置知识点】84. 柱状图中最大的矩形(难度:困难)class Solution: def maximalRectangle(self, matrix: List[List[str]]) -> int: de原创 2020-12-26 13:17:28 · 257 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题前置知识点】84. 柱状图中最大的矩形(难度:困难)
84. 柱状图中最大的矩形给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。例如:思路:两次遍历,使用单调栈得出该高度的左右边界,然后求最大面积class Solution: def largestRectangleArea(self, heights: List[int]) -> int: if not heights: return 0原创 2020-12-26 12:05:52 · 219 阅读 · 2 评论 -
【12月打卡~Leetcode每日一题】649. Dota2 参议院(难度:中等)
649. Dota2 参议院思路:循环队列模拟,当某一阵营人数为0截止class Solution: def predictPartyVictory(self, senate: str) -> str: counter = collections.Counter(senate) r,d = counter["R"],counter["D"] queue = collections.deque(senate) while(r原创 2020-12-11 11:10:16 · 167 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】659. 分割数组为连续子序列(难度:中等)
659. 分割数组为连续子序列给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。这道题看起来不难,但其实不是很容易有较好的思路。思路:最小堆+哈希表暂存遍历每一个数组中的数字,判断该数字 - 1 是否在哈希表中有存储(哈希表中存储了每一个数所对应的一个维护好的最小堆,最小堆存的是在此之前的所有长度),如果有存储,则将该最小堆的堆顶值移动原创 2020-12-04 12:54:31 · 206 阅读 · 0 评论 -
【11月打卡~Leetcode每日一题】406. 根据身高重建队列(难度:中等)
406. 根据身高重建队列假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。思路很简单,从队列中选人排列的优先级① k_ = 0 的优先② h 小的优先注意:这里的k_是指在排列了n个人后,所对应的k减去n个人中身高大于等于他的结果举个例子:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]先对原队列以数组中第一个元素升序,第二个元素降序排原创 2020-11-16 10:47:51 · 131 阅读 · 0 评论 -
【11月打卡~Leetcode每日一题】973. 最接近原点的 K 个点(难度:中等)
973. 最接近原点的 K 个点我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。思路:暴力排序,时间复杂度O(nlogn),空间复杂度O(logn)class Solution: def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]:原创 2020-11-09 14:46:41 · 178 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】19. 删除链表的倒数第N个节点(难度:中等)
19. 删除链表的倒数第N个节点给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5第一次提交:选择了一个较为稳妥的两次遍历,时间复杂度为O(n),空间复杂度为O(n)的做法,先遍历存储,再遍历输出# Definition for singly-linked list.# class ListNode:#原创 2020-10-18 13:40:36 · 168 阅读 · 1 评论 -
【10月打卡~Leetcode每日一题】142. 环形链表 II(难度:中等)
142. 环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x#原创 2020-10-10 20:13:56 · 235 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】18. 四数之和(难度:中等)
18. 四数之和给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。排序+双指针class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: quadruplets = list()原创 2020-10-05 21:54:19 · 660 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】347. 前 K 个高频元素(难度:中等)
347. 前 K 个高频元素题目看着不难,其实要想通过还有一点难度,因为他会卡时间复杂度,我在这里讨了个巧,直接用的collections的counter计数器和内置堆函数,实现起来很轻松class Solution: def topKFrequent(self, nums: List[int], k: int) -> List[int]: dic = collections.Counter(nums) heap, ans = [], []原创 2020-09-07 19:35:25 · 162 阅读 · 0 评论 -
【8月打卡~Leetcode每日一题】109. 有序链表转换二叉搜索树(难度:中等)
109. 有序链表转换二叉搜索树给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。思路是找链表的中位数作为根节点,左半链表作为左子树,右半链表作为右子树,并递归下去,即可得到答案但是问题主要是链表不像列表/数组一样很好找中位数,有一个做法是先将其转换成列表/数组,再找中位数;如果是对链表本身直接找中位数,可以使用快慢指针法,快指针每次向右移动2次,慢指针每次向右移动1次,当快指针遍历完毕原创 2020-08-18 11:12:05 · 180 阅读 · 0 评论 -
【8月打卡~Leetcode每日一题】20. 有效的括号(难度:简单)
20. 有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。看到题目标记为简单就直接做了class Solution: def isValid(self, s: str) -> bool: symbols = [0,0,0] for symbol in s: i原创 2020-08-14 09:10:25 · 166 阅读 · 0 评论 -
【8月打卡~Leetcode每日一题】207. 课程表(难度:中等)
207. 课程表你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?思路:①建立两个哈希表,第一个用来存放某门课需要的先修课程数,第二个用来存放关系(某门课是哪些课程的先修课程)②创建一个安全队列,将无需先修的课程放入③维护这个安全队列,每次取出一个,根据第二个哈希表的原创 2020-08-04 10:26:41 · 503 阅读 · 0 评论 -
【重拾算法~Leetcode每日一题】167. 两数之和 II - 输入有序数组(难度:简单)
167. 两数之和 II - 输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释: 2 与 7 之和等于目标数原创 2020-07-20 08:48:05 · 215 阅读 · 0 评论