![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Mr_tianyanxiaobai
这个作者很懒,什么都没留下…
展开
-
手写 LRU 算法
定义缓存的本质是以空间换时间,那么缓存的容量大小肯定是有限的,当缓存被占满时,缓存中的那些数据应该被清理出去,那些数据应该被保留呢?这就需要缓存的淘汰策略来决定。事实上,常用的缓存的淘汰策略有三种:先进先出算法(First in First out FIFO);淘汰一定时期内被访问次数最少的页面(Least Frequently Used LFU);淘汰最长时间未被使用的页面(Least Recently Used LRU)这些算法在不同层次的缓存上执行时具有不同的效率,需要结合具体的场景来选择。F原创 2021-09-21 20:52:57 · 322 阅读 · 0 评论 -
leetcode:79.Word Search
问题Given an m x n grid of characters board and a string word, return true if word exists in the grid.The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The same letter原创 2021-06-19 10:19:06 · 76 阅读 · 0 评论 -
leetcode-1074
问题描述给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。子矩阵 x1, y1, x2, y2 是满足 x1 <= x <= x2 且 y1 <= y <= y2 的所有单元 matrix[x][y] 的集合。如果 (x1, y1, x2, y2) 和 (x1’, y1’, x2’, y2’) 两个子矩阵中部分坐标不同(如:x1 != x1’),那么这两个子矩阵也不同。思路前缀和的思路,就是计算前 x,yx,yx,y 的和原创 2021-04-27 15:47:52 · 140 阅读 · 0 评论 -
leetcode:1498
问题满足所给数字和的数字子串:给你一个整数数组 nums 和一个整数 target 。请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。由于答案可能很大,请将结果对 10^9 + 7 取余后返回。思路首先肯定对原数组进行排序当排序后数组的一个子数组 nums[left:right]nums[left:right]nums[left:right] 存在 nums[left]+nums[right]<targetnu原创 2021-04-25 19:17:09 · 124 阅读 · 0 评论 -
Leetcode 992
问题描述给予一个数组和一个 K 值。找到该数组下所有的 存在着 K 个不同字符的子数组个数。思路设立三个指针 i, j, k当前循环次数为 i:A[i]-A[j] 表示以第 i 个数开始,子数组 A[i:j] 表示不同值为 K 时的最小子数组。A[i]-A[k] 表示以第 i 个数开始,子数组 A[i:k] 表示不同值为 K+1 时的最小子数组。从 i 到 j 的符合条件的子数组为 k-j+1如下:class Solution(object): def subar原创 2021-04-23 22:04:45 · 170 阅读 · 0 评论 -
leetcode239
Sliding Window Maximum描述:维护一个k大的窗口,窗口在向右滑行的过程中,每滑动一步,返回当前窗口里的最大值。思路不是简单的滑动一下,就行了的。这种思路的复杂度为 o(n2)o(n^2)o(n2)借助一个辅助队列(双端队列),从头遍历数组,根据如下规则进行入队列或出队列操如果队列为空,则当前数字入队列如果当前数字大于队列尾,则删除队列尾,直到当前数字小于等于队列尾,或者队列空,然后当前数字入队列如果当前数字小于队列尾,则当前数字入队列如果队列头超出滑动窗口范原创 2021-04-20 15:47:53 · 95 阅读 · 0 评论 -
leetcode:567
问题:567. Permutation in String给定两个字符串s1和s2,如果s2包含s1的 排列,则编写一个函数以返回true。 换句话说,第一个字符串的排列之一是第二个字符串的子字符串。换句话说,判断s2中是否有一个子字符串为 s1的全排列的任意一仲。如s1=abc,则判断s2中是否存在 abc 或 acb 或 bac 或 bca 或 cab 或c basolution维持一个动态变化窗口window用于记录已匹配字符以及字符个数某个字符个数已经满足要求,sta_num+=1,原创 2021-04-17 16:13:28 · 251 阅读 · 1 评论 -
leetcode956
最高的广告牌:找两个相同子集的最大和,砝码问题你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋的长度为 1、2 和 3,则可以将它们焊接在一起形成长度为 6 的支架。返回广告牌的最大可能安装高度。如果没法安装广告牌,请返回 0。solution1可以将问题简化为:给每个元素加上(0,-1,1)的系数,使得和为0,令系数为1的元素之和最大。...原创 2021-04-16 22:35:11 · 148 阅读 · 0 评论 -
匈牙利算法
描述一种求解二部图的最佳匹配算法。最佳匹配:表示二部图中的每一个点都被匹配上了,每个顶点只能被配对一次解决思路:若当前节点不在匹配内,以当前节点为根节点寻找增广路径,将增广路径加入最大匹配即可。具体算法:初始化: 设 M 是初始匹配,H是扎根于M非饱和点 u 的交错树,令 S 保存 X 相关坐标 ,T保存Y相关坐标若M饱和在 X 的所有顶点,则停止。否则,设 u为 x中的M非饱和点,置S={u},T=空若N(s)=T,则G中不存在完美匹配。否则,设y∈N(S)-T若 y 为 M 饱和原创 2021-04-15 22:22:45 · 160 阅读 · 0 评论 -
leetcode42
leetcode42: 接雨水Solution创建两个DP;DPL[i] 用于存取 x=ix=ix=i 时的左边界,DPR[i] 用于存取 x=ix=ix=i 的右边界维护上面两个table只需从左到右遍历一次,再从右到左遍历一次即可DPL[i+1] = max(DPL[i],height[i])DPR[i] = max(DPR[i+1],height[i+1])通过左右左边计算每个刻度的蓄水量class Solution(object): def trap(self, hei原创 2021-04-13 21:29:10 · 88 阅读 · 0 评论 -
leetcode120
120. 三角形最小路径和SolutionBFS的思想,计算出当前步中最小的DP[i+1][j]= min(DP[i][j]+triangle[i+1][j],DP[i+1][j])DP[i+1][j+1]= min(DP[i][j]+triangle[i+1][j+1],DP[i+1][j+1])class Solution(object): def minimumTotal(self, triangle): """ :type triangle:原创 2021-04-13 21:18:34 · 111 阅读 · 0 评论 -
leetcode264
leetcode264:丑数solutionDP[i] 存取第 i 个丑数存着三个指针,分别表示 2,3,5的被乘数 a,b,cDP[i]= min(DP[a]*2,DP[b]*3,DP[c]*5)update a,b,cclass Solution(object): def nthUglyNumber(self, n): """ :type n: int :rtype: int """ ### 每个值原创 2021-04-13 21:08:07 · 65 阅读 · 0 评论 -
leetcode95
leetcode95Solution先序遍历的思想,选取剩下的子集中任意一个作为left,一个作为right。建立相应的树。即双重循环的遍历,在循环内部添加root,最后将root 添加到list中去。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val = val#原创 2021-04-13 20:51:53 · 123 阅读 · 0 评论 -
leetcode62-63
leetcode63. 不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。SolutionDP[i][j] 表示 (0,0)到(i,j)的路数DP[i][j] = DP[i][j-1]+DP[i-1][j]class原创 2021-04-13 20:44:55 · 121 阅读 · 0 评论 -
leetcode 987
987. 二叉树的垂序遍历给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。返回二叉树的 垂序遍历 序列。s原创 2021-04-13 20:32:58 · 140 阅读 · 0 评论 -
leetcode1024
问题你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,则返回 -原创 2021-04-13 20:15:43 · 126 阅读 · 0 评论 -
leetcode-44
问题solutionDP[i,j] 表示 s[0…i] 与 p[0…j] 是否match(左闭右开)s[i-1]==p[j-1]:DP[i][j] = DP[i-1][j-1]p[j-1]=="?":DP[i][j] = DP[i-1][j-1]p[j-1]=="*":DP[i][j] = DP[i][j-1] or DP[i-1][j]class Solution(object): def isMatch(self, s, p): #DP[i,j] 表示a[0原创 2021-04-13 19:49:28 · 78 阅读 · 0 评论 -
leetcode139
问题给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。solution动态规划:DP[i] = {DP[j] and s[j:i] is wordDict} j= 0:i,对集合去或,得到最终的结果。class Solution(object): def wordBreak(self, s, wordDict):原创 2021-04-13 19:34:06 · 105 阅读 · 0 评论 -
leetcode:140单词拆分 II
问题:根据字典分割单词给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。求解回溯的思想backup(i),表示 s[0,i] 已构成句子,现将 s[i:len(s)]构成句子每个backup函数中,遍历 j= i:len(s) 中的所有值。如果s[i,j]能构成单词,添加s[i,j]到list中-原创 2021-04-13 19:16:35 · 74 阅读 · 0 评论 -
砝码问题-3的n次方
问题:砝码问题,给出一堆砝码,砝码的重量是3的0次方,3的1次方,一直到3的无限次方,每种砝码只有一个。现在给出一个天平和一个物品,物品的重量为X(X是整数),当物品和砝码放置在天平上,使得天平保持平衡(砝码可以放置到和物品同一边),物品的重量X就被称出来了。问题一:对于任意X,如何判断物品是否能被天平和这堆砝码称出来。问题二:如果能,如何得出称的具体方案。例如:X=2,能够被称出来,具体方案为 31=X+303^1 = X + 3^031=X+30Solution代码x = 68de原创 2021-04-11 10:25:26 · 1510 阅读 · 0 评论 -
Python 排序算法
快排x = [6,1,2,7,9,3,4,5,10,8]def quick_sort(start,end,x): if(start>end): return x f = x[end] high = end-1 low = start while(low<=high): while (low <= high): if (x[low] > f): brea原创 2021-04-09 22:11:58 · 76 阅读 · 0 评论 -
leetcode467
问题把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…".现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。注意: p 仅由小写的英文字母组成,p 的大小可能超过 10000。解决思路原创 2021-04-04 11:52:54 · 85 阅读 · 0 评论 -
LeetCode 376
题目描述如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 [6,-3,5,-7,3] 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删原创 2021-04-01 09:36:48 · 84 阅读 · 0 评论 -
leetcode-1028
问题:先序恢复原树思路横线的多少代表了该节点是在二叉树的第几层沿着先序遍历的路再走一遍即可# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightc原创 2021-03-26 22:15:32 · 107 阅读 · 2 评论 -
LeetCode987
Solution思路:通过一个二维的字典存储树的col和row,最后排序,遍历即可:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solu..原创 2021-03-23 15:28:01 · 90 阅读 · 0 评论 -
LeetCode 685
题目在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。输入一个有向图,该图由一个有着 [公式] 个节点(节点值不重复 [公式])的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [公式],用以表示有向图中连接顶点 [公式] 和 [公式] 和顶点的边,其中父节点 [公式] 是子节点 [公式] 的一个父节点。返回原创 2021-03-16 10:26:13 · 107 阅读 · 0 评论 -
LeetCode1371
问题描述给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。二叉搜索树的定义如下:任意节点的左子树中的键值都 小于 此节点的键值。任意节点的右子树中的键值都 大于 此节点的键值。任意节点的左子树和右子树都是二叉搜索树思路DFS 递归要判断该子树是否是二叉搜索树,需要四个条件:1.左子树是否是二叉搜索树2.右子树是否是二叉搜索树。3.根节点的值是否大于左子树最大值4.根节点的值是否小于右子树的最小值。# Definition for a bi原创 2021-03-15 11:01:46 · 140 阅读 · 0 评论 -
LeetCode1649:插入排序代价分析
问题描述给定一个整数数组instrution,你从左到右把每个元素加入到数组nums中(初始为空),每次加入使得nums的数有序。每次加入的代价是下面两个数的最小值:nums中严格小于当前这个元素的数的个数nums中严格大于当前这个元素的数的个数代码import bisectimport numpy as npclass Solution(object): def createSortedArray(self, instructions): """原创 2021-03-13 20:24:15 · 145 阅读 · 0 评论 -
leetcode493
问题计算反序对Solution排序,找 2×num[i]+1的下标import bisectclass Solution(object): def reversePairs(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums)==0: return 0 sortedlist = [nu原创 2021-03-12 09:13:40 · 77 阅读 · 0 评论 -
LeetCode327
问题解决方法最简单的方法,计算出所有的前缀和,然后遍历所有的下标对,然后利用o(1)的方式取前缀和,然后相减,得到这个下标对之间的参数和。遍历下标对的时间复杂度为 o(n^2)采用树状数组的方法Pre为前缀和数组, 从小到大枚举 j, 由于 lower≤Pre[j]−Pre[i−1]≤upperlower≤Pre[j]−Pre[i−1]≤upperlower≤Pre[j]−Pre[i−1]≤upper ,可以得到 P[i−1] 满足 Pre[j]−upper≤Pre[i−1]≤Pre[j]−l原创 2021-03-11 09:42:54 · 129 阅读 · 0 评论 -
LeetCode315
问题计算右侧小于当前元素的个数暴力破解该代码是能输出正确值,但是由于时间复杂度太高,并不能满足上面的范围要求import numpy as npclass Solution(object): def countSmaller(self,nums): """ :type nums: List[int] :rtype: List[int] """ count=[] nums = np.array(原创 2021-03-09 18:17:58 · 198 阅读 · 0 评论 -
LeetCode218:天际线问题
城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B)个建筑物的几何信息用三元组[Li,Ri,Hi]表示,其中Li和Ri分别是第 i 座建筑物左右边缘的 x 坐标,Hi 是其高度。可以保证0 ≤ Li, Ri ≤ INT_MAX, 0 < Hi ≤ INT_MAX和Ri - Li > 0。您可以假设所有建筑物都是在绝对平坦且高度为 0 的表面上的完美矩形。原创 2021-03-06 17:02:41 · 169 阅读 · 0 评论 -
LeetCode96
给出BST 的中序排列,输出所有可能结构的总数:思路最简单的思路,和code95类似,分别算出left 和 right ,代码如下:class Solution(object): def beTravl(self,start,end): if start > end: return 1 if start == end: return 1 root_len = 0 for ro原创 2021-02-28 21:52:43 · 144 阅读 · 1 评论 -
LeetCode 95
根据BST的中序遍历,还原所有可能的结构思路本质是一个后序遍历由于每次选择一个节点为root节点后,与之连接的左子节点可以为[start,root-1]。右子节点可以为 [root+1,end]由于两种的可选择很多,因此必然需要两个循环来遍历所有可能的左子树与右子树,并且接在root后面。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None,原创 2021-02-28 21:04:00 · 105 阅读 · 1 评论 -
LeetCode-99
二叉查找树的恢复solution:思路:BFS中序遍历本应该是从小到大排列 设置两个全局变量,记录遍历中出错的两个节点 当当前节点大于上一个节点时,这两个节点被选为可能出错节点 将两个出错节点的值互换# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val..原创 2021-02-27 21:33:12 · 169 阅读 · 0 评论 -
LeetCode-105
已知前序和中序遍历,重新构造二叉树Solution思路 : 前序遍历序列用于找出当前节点的值,后序遍历序列用于分开前序序列中那些部分是左子树,哪些部分是右子树节点。本质还是前序遍历的结构上,添加参数# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, val=0, left=None, right=None):# self.val = val#原创 2021-02-27 20:21:38 · 92 阅读 · 0 评论 -
LeetCode-124
计算所有路径下的最大路径和A path in a binary tree is a sequence of nodes where each pair of adjacent nodes in the sequence has an edge connecting them. A node can only appear in the sequence at most once. Note that the path does not need to pass through the root.The原创 2021-02-27 17:53:21 · 139 阅读 · 0 评论