
算法随笔
文章平均质量分 59
_六六先森
就算被世界痛击,我也要挣扎站起。
展开
-
leetcode514-自由之路-用bfs来搜索最短路径
视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串ring,表示刻在外环上的编码;给定另一个字符串key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使key的一个字符...原创 2019-07-06 23:06:52 · 629 阅读 · 0 评论 -
leetcode139单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "lee...原创 2018-07-15 18:24:57 · 499 阅读 · 0 评论 -
287. 寻找重复数---数组链表的应用
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。 只能使用额外的 O(1) 的空间。 时间复杂度...原创 2018-07-19 11:04:08 · 249 阅读 · 0 评论 -
310. 最小高度树
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。格式该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无...原创 2018-07-19 10:03:26 · 1741 阅读 · 0 评论 -
leetcode368最大整除子集——动态规划与数学原理结合
给出一个由无重复的正整数组成的集合, 找出其中最大的整除子集, 子集中任意一对 (Si, Sj) 都要满足: Si % Sj = 0 或 Sj % Si = 0。如果有多个目标子集,返回其中任何一个均可。示例 1:集合: [1,2,3]结果: [1,2] (当然, [1,3] 也正确) 直觉告诉我先排个序是很稳的,但是一般动态规划都是计算什么解的长度,解的最大最小值之类的,突然要返回一个解,...原创 2018-07-12 16:53:51 · 2310 阅读 · 2 评论 -
leetcode442. 数组中重复的数据————一定条件下的脑筋急转弯
题目:给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]如果不给空间限制,那么哈希表扫描一次即可。然而不用任何额外的空间就需要一些小技巧了。通过网上其他人的方法,我发现使用了下标取...原创 2018-07-06 09:28:44 · 996 阅读 · 0 评论 -
334. 递增的三元子序列
题目:给定一个未排序的数组,请判断这个数组中是否存在长度为3的递增的子序列。正式的数学表达如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。要求算法时间复杂度为O(n),空间复杂度为O(1) 。示例:输入 [1...原创 2018-07-18 13:29:20 · 981 阅读 · 0 评论 -
leetcode395至少有k个重复字符的最长子串
题目:找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。示例 1:输入:s = "aaabb", k = 3输出:3最长子串为 "aaa" ,其中 'a' 重复了 3 次。示例 2:输入:s = "ababbc", k = 2输出:5最长子串为 "ababb" ,其中 'a'...原创 2018-07-18 11:42:42 · 2163 阅读 · 0 评论 -
leetcode416分割等和子集——又一个背包问题
题目:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11]. 首先可以看出如果数组和为奇数,是无法分割的(自然数乘以二都是偶数)。然后其中一个基本想法是BFS,这个数字n...原创 2018-07-12 09:36:35 · 3053 阅读 · 0 评论 -
leetcode390消除游戏
给定一个从1 到 n 排序的整数列表。首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。我们不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。返回长度为 n 的列表中,最后剩下的数字。示例:输入:n = 9,1 2 3 4 5 6 7 8 92 4...原创 2018-07-22 12:33:38 · 1348 阅读 · 2 评论 -
leetcode835引发的位距离思考
题目暂且不说,我们考虑一个简化版的题目。设有同长度为n的两个比特串(0,1序列),可以任意移动(左或者右)其中一个任意距离的情况下,求出能够重叠的1的数量。不妨假设a=【1,1,1,0】b=【0,0,1,1】我们初始化一个长度为2倍的全为0的数组【0,0,0,0,0,0,0,0】然后求a里的每个1与b里的每个1差了有多远,可以得到a0-b2=-2,a0-b3=-3,a1-b2=-1...原创 2018-08-09 10:25:05 · 464 阅读 · 0 评论 -
对付回文序列的利器——马拉车算法
马拉车算法(Manacher,我觉得应该读马拿车啊。。。)是基于中心扩散算法的一种改进。什么叫中心扩散算法呢?举个简单的例子,假设有字符串1234135314,我们从5开始往两边扩散,就能够,经过O(n)时间(实际上远远达不到)就可以找到这个字符串的子串 :13531。可能细心的人已经发现这个算法的小漏洞——如果回文串是偶数长度的呢?比如:1344554451的正确答案应当是445...原创 2019-03-23 15:00:51 · 559 阅读 · 0 评论 -
如何求n!阶乘里第k个排列
此问题来源于leetcode第60题。题目链接对于一个序列123,我们称123,132,213,231,312,321是它的全排列。离散数学有一种从后向前搜索替换的方法生成下一个全排列。这种方法持续k次就可以找到第k个。然而效率感人。或者有一种从前向后依次交换的方法生成全排列,实际上这些方法本质上都一样,通过交换某一对数字来生成下一个排列。但是我们可以通过一种类似于字典序生...原创 2019-03-25 09:44:09 · 1175 阅读 · 0 评论 -
leetcode105,106用前序/后序以及中序构造二叉树
题目的描述就不写了,给出一个前序/后序遍历的得到的数组,还有中序的数组构造出二叉树。刚开始感觉是递归着做,后来105参考了下答案,106也就很快做出来了,毕竟是同样的思路。按照题目示例:后序:【9,15,7,20,3】。前序:【9,3,15,20,7】。我们知道对于一个三节点二叉树,b,c是a的子树,那么中序:b,a,c,后序:b,c,a。我们想要得到这个树的根节点,就要从后往...原创 2018-08-08 21:15:39 · 167 阅读 · 0 评论 -
leetcode688. “马”在棋盘上的概率
已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从0开始。即最左上角的格子记为 (0, 0), 最右下角的记为 (N-1, N-1)。 现有一个“马”(也译作“骑士”)位于 (r, c) ,并打算进行 K 次移动。 如下图所示,国际象棋的“马”每一步先沿水平或垂直方向移动2个格子,然后向与之相垂直的方向再移动1个格子,共有8个可选的位置。现在“马”每一步都从可选的位置(包括棋...原创 2018-08-11 09:24:14 · 1348 阅读 · 0 评论 -
858. 镜面反射
有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。 示例:输入: p = 2, q = 1输出: 2解释: 这条光线在第一次被反射回左边的墙时...原创 2018-08-10 20:20:11 · 567 阅读 · 0 评论 -
leetcode801. 使序列递增的最小交换次数
我们有两个长度相等且不为空的整型数组 A 和 B 。我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < ... < A[A.length - 1])。给定数组 A 和 B ,请返回使得两个数组均保持...原创 2018-08-10 13:54:58 · 5581 阅读 · 3 评论 -
leetcode873. 最长的斐波那契子序列的长度
如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3 对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素...原创 2018-08-10 11:21:36 · 2898 阅读 · 0 评论 -
leetcode813. 最大平均值和的分组
思路来源:https://blog.youkuaiyun.com/magicbean2/article/details/79893634题目:我们将给定的数组 A 分成 K 个相邻的非空子数组 ,我们的分数由每个子数组内的平均值的总和构成。计算我们所能得到的最大分数是多少。注意我们必须使用 A 数组中的每一个数进行分组,并且分数不一定需要是整数。示例输入: A = [9,1,2,...原创 2018-08-09 20:15:42 · 1868 阅读 · 0 评论 -
leetcode402. 移掉K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。示例 1 :输入: num = "1432219", k = 3输出: "1219"解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。示例 2 :输入: num = "10200", k = 1输出...原创 2018-07-11 19:19:29 · 454 阅读 · 0 评论 -
leetcode406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]说白了就是...原创 2018-07-11 15:12:59 · 3206 阅读 · 0 评论 -
递减栈求解下一个更大元素问题
首先贴出两道题:leetcode739根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 3000...原创 2018-07-04 19:15:17 · 915 阅读 · 0 评论 -
leetcode 464.can i win
二话不说先贴题目。In the "100 game," two players take turns adding, to a running total, any integer from 1..10. The player who first causes the running total to reach or exceed 100 wins.What if we change the g...原创 2018-06-06 09:42:46 · 607 阅读 · 0 评论 -
动态规划问题之求组合数
我们知道,组合数在组合数学中非常有用,组合数是一个十分常用的数字。比如,书架上有4本书ABCD,我们想拿2本读,那么有C(4,2)种方法。这个数字的求法是:4!/2!(4-2)!,其中n!=1*2*3...n,是阶乘数。所以按定义求其实也十分“容易”,这里是指容易写罢了。先求一个阶乘:def fac(n): if n<=1: return 1 s=1 ...原创 2018-05-24 17:12:16 · 5149 阅读 · 0 评论 -
leetcode 201数字范围按位与
题目:给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。示例 1: 输入: [5,7]输出: 4示例 2:输入: [0,1]输出: 0那个啥。。。不会有人想用循环一点点“&”出来吧?不过我觉得这题虽然最终结果很简单,但是我却提交了好几次,每次都是细节,思维的不足。第一步当然先观察嘛...原创 2018-06-04 21:47:23 · 2569 阅读 · 0 评论 -
leetcode 306.累加数
今天在leetcode遇到一道很有意思的题。累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。示例 ...原创 2018-06-04 15:39:24 · 1701 阅读 · 0 评论 -
杨氏矩阵的构建与搜索之类堆数组的算法
杨氏矩阵是什么?比如一个矩阵:1 3 62 4 76 8 9从左往右是增大的,从上到下也是增大的。实际上我第一次见到这玩意是在牛客网上做到的一道题:“已知这样一个矩阵,请在线性时间找到是否含有目标元素。”答案是这样:命令指针指向左下角元素,如果小于目标值,就往右移动,如果大于目标值,就向上移动,直到越界。这个看似精妙的矩阵就是杨氏矩阵,在《算法导论》第六章提到,而且第六章是讲述的堆及其算法。思考一...原创 2018-05-20 17:19:17 · 404 阅读 · 1 评论 -
单词序列求字典序之桶排序
我们知道python的sort方法是快速的O(nlgn)方法。而且对于一个单词序列也是一样。对于水果序列:fruits=['peach','watermelon','pear','apple','grape','orange','banana','lemon']排序后可以得到:['apple', 'banana', 'grape', 'lemon', 'orange', 'peach', 'pea...原创 2018-05-20 17:06:09 · 1226 阅读 · 0 评论 -
快速排序之重复元素过多的改进
快速排序快的一点毛病没有(重新贴一下代码):def qsort(arr,lo,hi): if hi-lo<=1: return pivot=arr[lo] i,j=lo+1,hi-1 while True: while i<hi and arr[i]<=pivot: i+=1 ...原创 2018-05-20 16:48:40 · 6845 阅读 · 3 评论 -
解决最坏情况快速排序之随机序列
快速排序非常快,不过最慢的时候也挺慢的。这是一个依赖于随机化输入的算法。所以我想了一招,来随机化这个输入,达到最棒的效果。首先,普通的快速排序如下:def qsort(arr,lo,hi): if hi-lo<=1: return pivot=arr[lo] i,j=lo+1,hi-1 while True: while i&l...原创 2018-05-20 16:37:44 · 2265 阅读 · 0 评论 -
leetcode 829. 连续整数求和
我真的是个人才,但MMP,python太慢了!我看这个第一遍:暴力搜索!ok,复杂度O(N^2),不和你闹,我换招。然后我就写了9的连续子序列和,我靠?我好像发现了什么。首先如果子序列长度是1:那么这些和是{1,2,3...9}如果子序列长度是2:{3,5,7,...17}以此类推,我们发现这些数字的集合中,9出现的次数便是答案。但是如果首项大于9了,比如序列长为4:{10,14,...}那么直接...原创 2018-06-06 10:58:42 · 1886 阅读 · 0 评论 -
leetcode 338. Bit位计数
题目:给定一个非负整数 num。 对于范围 0 ≤ i ≤ num 中的每个数字 i ,计算其二进制数中的1的数目并将它们作为数组返回。示例:比如给定 num = 5 ,应该返回 [0,1,1,2,1,2].进阶:给出时间复杂度为O(n * sizeof(integer)) 的解答非常容易。 但是你可以在线性时间O(n)内用一次遍历做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗? 在...原创 2018-06-06 11:26:28 · 335 阅读 · 0 评论 -
leetcode424替换后的最长重复子串——利用滑动窗口解决范围计数
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度 和 k 不会超过 104。示例 1:输入:s = "ABAB", k = 2输出:4解释:用两个'A'替换为两个'B',反之亦然。示例 2:输入:s = "AABABBA", k = 1输出:4解释...原创 2018-07-11 10:19:49 · 2419 阅读 · 0 评论 -
Leetcode560. 和为K的子数组——数组记录和的改良
在过去,我常常使用这个方法来迅速求范围和。比如数组arr=【1,2,3,4,5,6,】我可以用公式sums[i]=sums[len(sums)-1]+arr[i]来获得一个数组的范围和数组【1,3,6,10,15,21】这样通过范围相减可以迅速求得范围和,而不需遍历。leetcode560是这种方法的改良版。题目:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示...原创 2018-07-10 10:41:13 · 966 阅读 · 0 评论 -
01背包学习(1)
经典的动态规划问题是这样:题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 解答函数package(n,w,costs,values)的四个参数分别是物品数量,可容纳最大值,第i个物品花费costs【i】和价值values【i】,要求最大的价值和。设dp【i】【j】为前i个物品放进容量为j...原创 2018-07-09 21:48:05 · 173 阅读 · 0 评论 -
基本经典算法——数组的最长上升子序列(非连续)
对与最长连续上升子序列,我们只需双指针来遍历即可。对于不连续的,我们需要用动态规划来解决这个问题。我们使用一个示例来演示这个算法。arr=【1,3,5,4,6】并且令dp【i】为“以第i个数字arr【i】结尾的最长上升子序列”,首先dp应该初始化为【1,1,1,1,1】,因为哪怕是单调递减的数组也是有上升子序列———单个元素。首先注意到一个事实,dp【k】依赖于前k-1个数字,我们需要找到小于ar...原创 2018-07-09 19:08:11 · 2453 阅读 · 1 评论 -
leetcode754 到达终点数字---精妙的数学恒等式
在一根无限长的数轴上,你站在0的位置。终点在target的位置。每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。返回到达终点需要的最小移动次数。示例 1:输入: target = 3输出: 2解释:第一次移动,从 0 到 1 。第二次移动,从 1 到 3 。示例 2:输入: target = 2输出: 3解释:第一次移动,从 0 到 1 。第二次移动...原创 2018-07-08 22:50:24 · 2277 阅读 · 1 评论 -
leetcode713最乘积小于k的子数组
给定一个正整数数组 nums。找出该数组内乘积小于 k 的连续的子数组的个数。示例 1:输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。需要注意的是 [10,5,2] 并不是乘积小于100的子数组。说明:0 < num...原创 2018-07-08 14:48:33 · 1632 阅读 · 2 评论 -
leetcode 319. 灯泡开关
初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则打开,如果打开则关闭)。第 i 轮,你每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。示例:输入: 3输出: 1 解释: 状态off表示灯泡关闭,on表示开启。初始时, 灯泡状态 [off...原创 2018-06-07 11:03:09 · 2000 阅读 · 0 评论 -
leetcode 11. 盛最多水的容器
题目:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。注意:你不能倾斜容器,n 至少是2。分析:容积公式为abs(i-j)*min(height[i],height[j])1,暴力搜索:对所有成对的竖线...原创 2018-06-06 22:21:33 · 204 阅读 · 0 评论