
队列
abant2
世界上最菜的arcem
展开
-
leetcode 17 电话号码组合 笛卡尔积
此题是面试遇见的一道题,当时出的是笛卡尔积,和这个其实道理是一样的。此题如果用标准的回溯做,是会出问题的。一开始做的时候,我是把他当全排列做的。但全排列是没有重复状态的,每次选一个。一个状态的前继状态只有一种可能。但笛卡尔积问题是不止一个前继状态,有重复节点就很难记录,所以此题采用迭代+队列来做是最好的。class Solution {public: vector<string> letterCombinations(string digits) { int n.原创 2021-07-24 15:22:14 · 324 阅读 · 0 评论 -
leetcode 1871 动态前缀和,差分,dp,贪心 无敌题目
思路一:对于任意一个位置iii,我们判断它能不能跳到,要看i−maxJumpi-maxJumpi−maxJump和i−minJumpi-minJumpi−minJump区间内是否有1,有的话就可以跳到。这个可以用前缀和来做。但是,问题是我们要看的不是sss数组中的1,而是对dpdpdp数组求前缀和。但我们还没有dpdpdp数组。由于此题只取决于前面的dpdpdp,我们可以直接对dp数组做前缀和。用前缀和时要注意,由于前缀和数组第一个是0,当想取[l,r][l,r][l,r]区间内数时,需要dp[r+1].原创 2021-05-23 22:09:44 · 162 阅读 · 2 评论 -
leetcode 649 队列代替字典
解法一:字典看到题,啪的一下就出来了,但是做的其实不好。条件太多,挺笨的。class Solution: def predictPartyVictory(self, senate: str) -> str: d = [0, 0] tp_ct = [0, 0] tmp = '' while True: for s in senate: if s == 'R':原创 2020-12-11 15:09:48 · 125 阅读 · 0 评论 -
leetcode 387 扫描+延迟删除
解法一:扫两遍,第一遍存字典,第二遍遍历字典找到最小索引,代码如下:class Solution: def firstUniqChar(self, s: str) -> int: d = {} for i, c in enumerate(s): if c in d: d[c] = len(s) else: d[c] = i mi =原创 2020-12-23 09:53:41 · 139 阅读 · 0 评论 -
leetcode 995 区间翻转问题,队列
思路一:滑动窗口首先考虑第一个位置,只有一个窗口能翻转它。所以第一个窗口必须满足第一个位置。然后再看第二个元素,只有第一,第二个窗口能满足,第一个窗口是否翻转是固定的,所以第二个窗口是否翻转也固定,这样窗口一直滑动,咱们只需关心窗口的第一个元素就好。class Solution: def minKBitFlips(self, A: List[int], K: int) -> int: ret = 0 for i in range(len(A)-K+1):原创 2021-02-18 16:49:09 · 227 阅读 · 0 评论 -
leetcode 1438 滑动窗口维护最大值最小值
解法一:两个堆这个题很容易让人联想到上次的两个堆维护中位数的问题。相似的,这个题也可以用两个堆加上延迟删除分别维持最大值和最小值,复杂度为O(NlogN)。还有一个数据结构能达到和两个堆相似的效果,即平衡二叉树。from heapq import *from collections import defaultdictclass Solution: def longestSubarray(self, nums: List[int], limit: int) -> int:原创 2021-02-21 18:13:35 · 311 阅读 · 0 评论 -
leetcode 232 用栈实现队列
这个题是很有趣也很强的一道题。首先栈是不可能完美实现队列的,每次peek或者pop都会导致一次接近O(N)的操作,把左边数组移到右边。然后就不用管了。如果右边有数就都是O(1)的操作。class MyQueue: def __init__(self): """ Initialize your data structure here. """ self.s1 = [] self.s2 = [] self原创 2021-03-05 13:33:32 · 94 阅读 · 0 评论 -
剑指offer 09 队列和栈相互转换
用两个栈实现队列,摊还复杂度是O(1)。由于是老元素先出,咱们用另一个栈存老元素就行。用两个队列实现栈,我的解法是push时是O(N)的。由于栈是新元素先出,你不可能把所有新元素预存,所以你可以在push时把新元素放入底部,把另一堆排列好的老元素加进来。这样每次只用一个队列即可。from collections import dequeclass MyStack: def __init__(self): """ Initialize your data str原创 2021-03-12 15:23:38 · 172 阅读 · 0 评论