![](https://img-blog.csdnimg.cn/d2378b16cda848e6b4278813e9731aa1.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法通关村
文章平均质量分 74
通关算法通关村
孤舟一叶~
计科大二
展开
-
算法通关村第十七关—贪心其实很简单(青铜)
LeetCode455,分发饼干:假设你要给孩子们一些小饼干。但是每个孩子最多只能给一块饼干。每个孩子的饭量不同,对每个孩子ⅰ,都有一个胃口值9[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果s[j]>=g[i],我们可以将这个饼干j分配给孩子ⅰ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例:其中g是胃口,s是拥有的饼干。首先对g和s进行排序。然后从小到大遍历g中的每一个元素,对于每个元素找到能满足该元素的s中的最小元素。原创 2024-01-17 17:08:06 · 394 阅读 · 1 评论 -
算法通关村第十六关—滑动窗口经典问题(白银)
LeetCode3给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。要找最长子串,必然要知道无重复字符串的首和尾,然后再从中确定最长的那个,因此至少两个指针才可以,这就想到了滑动窗口思想。定义一个K-V形式的map,key表示的是当前正在访问的字符串,value,是其下标索引值。我们每访问一个新元素,都将其下标更新成对应的索引值。原创 2024-01-15 22:31:33 · 1897 阅读 · 1 评论 -
算法通关村第十四关—数据流的中位数(黄金)
相当于,把所有元素分成了大和小两半,而我们计算中位数,只需要大的那半的最小值和小的那半的最大值即可。比如,我们依次添加[1,2,3,4,5],砍成两半之后为[1,2]和[3,4,5],我们只要能快速的找到2和3即可。Java中的堆(即优先级队列)是使用完全二叉树实现的,我们这里的图也是以完全二叉树为例。小顶堆(minHeap):存储所有元素中较大的一半,堆顶存储的是其中最小的数。大顶堆(maxHeap):存储所有元素中较小的一半,堆顶存储的是其中最大的数。[2,3]的中位数是(2+3)/2=2.5。原创 2024-01-15 08:29:13 · 402 阅读 · 1 评论 -
算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)
题目要求:假设你有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序?分析:这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到内存里,因此我们只能将文件划分成一些块,每块大小是xMB,x就是可用内存的大小,例如1GB一块,那我们就可以将文件分为20块。我们先对每块进行排序,然后再逐步合并。这时候我们可以使用两两归并,也可以使用堆排序策略将其逐步合并成一个。相关方法我们在《查找》一章的堆排部分有介绍。这种排序方式也称为外部排序。原创 2024-01-14 21:36:38 · 981 阅读 · 0 评论 -
算法通关村第十五关—海量数据场景下的热门算法题(白银)
题目要求:给定一个输入文件,包含40亿个非负整数,请设计一个算法,产生一个不存在该文件中的整数,假设你有1GB的内存来完成这项任务。进阶:如果只有10MB的内存可用,该怎么办?本题不用写代码,如果能将方法说清楚就很好了,我们接下来一步步分析该如何做。原创 2024-01-14 21:20:29 · 861 阅读 · 0 评论 -
算法通关村第十五关—用4KB内存寻找重复元素(青铜)
分析:本身是一道海量数据问题的热身题,如果去掉“只有4KB”的要求,我们可以先创建一个大小为N的数组,然后将这些数据放进来,但是这里数组最大为32KB,而题目有4KB的内存限制,我们就必须先确定该如何存放这个数组。题目要求:给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。2^10个比特,这个值比32000要大的,因此我们可以创建32000比特的位向量(比特数组),其中一个比特位置就代表一个整数。原创 2024-01-14 20:35:24 · 416 阅读 · 0 评论 -
算法通关村第十六关—滑动窗口与堆结合(黄金)
每当我们向右移动窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。然而这个最大值可能并不在滑动窗口中,在这种情况下,这个值在数组nums中的位置出现在滑动窗口左边界的左侧。因此,当我们后续继续向右移动窗口时,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。为了方便判断堆顶元素与滑动窗口的位置关系,我们可以在优先队列中存储二元组(num,index),表示元素num在数组中的下标为index。滑动窗口每次只向右移动一位,返回滑动窗口中的最大值。原创 2024-01-14 20:25:50 · 577 阅读 · 0 评论 -
算法通关村第十一关—位运算如何实现压缩存储(黄金)
位运算有个很重要的作用就是能用比较小的空间存储比较多的元素。能帮助我们解决一些海量场景下的数据处理问题。本关内容与第15关《超大规模数据场景常见问题》的青铜挑战是一样的,你可以先思考一下位运算是如何解决问题的。原创 2024-01-13 20:46:42 · 388 阅读 · 0 评论 -
算法通关村第十一关—位运算的高频算法题(白银)
LeetCode191 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为1’的个数。题目给定的n是32位二进制表示下的一个整数。解法一:遍历的二进制表示的每一位,判断每一位是否为1,同时进行计数。也就说将原始数字和1进行&运算就能知道最低位是不是1了,那其他位置怎么算呢?我们可以有两种思路,让1不断左移或者将原始数据不断右移。原创 2024-01-13 19:50:59 · 1998 阅读 · 0 评论 -
算法通关村第十一关—理解位运算的规则(青铜)
与运算的符号是&,运算规则是:对于每个二进制位,当两个数对应的位都为1时,结果才为1,否则结果为0。或运算的符号是,运算规则是:对于每个二进制位,当两个数对应的位都为0时,结果才为0,否则结果为1。异或运算的符号是⊕(在代码中用∧表示异或),运算规则是:对于每个二进制位,当两个数对应的位相同时,结果为0,否则结果为1。取反运算的符号是~,运算规则是:对一个数的每个二进制位进行取反操作,0变成1,1变成0。以下例子显示上述四种位运算符的运算结果,参与运算的数字都采用有符号的8位二进制表示。原创 2024-01-13 15:38:26 · 1071 阅读 · 0 评论 -
算法通关村第十四关—堆能高效解决的经典问题(白银)
LeetCode215 给定整数数组ums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。这个题比较好的方法是堆排序法和快速排序法。快速排序在第十关白银挑战已经分析过,这里先看堆排序如何解决问题。这个题其实用大堆小堆都可以解决的,但是推荐“找最大用小堆,找最小用大堆,找中间用两个堆”,这样更容易理解,适用范围也更广。构造一个大小只有4的小根堆,为了更好说明情况,我们扩展一下序列[3,2,3,1,2,4,5,1,5,6,2,3]。原创 2023-12-31 17:42:48 · 937 阅读 · 1 评论 -
算法通关村第十关—归并排序(黄金)
归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干个比较小的数组,分成几个比较小的结构,然后是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分就是将问题分(divide)成一些小的问题分别求解,而治(conquer).则将分的阶段得到的各答案"合"在一起)。可以看到这种结构很像两棵套在一起的满二叉树。分阶段可以理解为就是递归拆分子序列的过程,递归深度为logn。就是图中上面侧的满二叉树。再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,就是下侧的满二叉树。原创 2023-12-24 14:09:14 · 157 阅读 · 1 评论 -
算法通关村第十关—数组中第K大的数字(白银)
这里还有一个关键信息,我们可以知道26的索引为3,所以递增排序之后26一定是第4大的元素。这就是解决本问题的关键,既然知道26是第4大,那如果我要找第2大,一定是要到右边找。如果要找第6大,一定要到左边找(当然,如果降序排序就反过来了),而不需要的那部分就不用管了。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。可以看到26最终被放到了属于自己的位置上,不会再变化,而26的左右两侧可以分别再进行排序。我们还是看上面排序的序列:{26,53,48,15,13,48,32,15}原创 2023-12-23 15:46:40 · 107 阅读 · 0 评论 -
算法通关村第十四关—堆结构(青铜)
堆的价值就在于大顶堆的根节点是整个树最大的那个,增加时会根据根的大小来决定要不要加,而删除操作只删除根元素。这个特征可以在很多场景下有奇妙的应用,后面的算法题全都基于这一点。这里可能有些人还有疑问,感觉不管插入还是删除,堆的操作都不简单,那为什么还说堆的效率比较高呢?这是因为堆元素的数量是有限制的,一般不用将所有的元素都放到堆里。后面题目中可以看到,在序列中找K大,则堆的大小就是K。如果K个链表合并,那么堆就是K。原理后面详细展开。1. 查找:找大用小,大的进;找小用大,小的进。原创 2023-12-21 15:00:38 · 78 阅读 · 0 评论 -
算法通关村第十六关—滑动窗口(青铜)
在数组章节我们说过很多算法会大量移动数组中的元素,频繁移动元素会导致执行效率低下或者超时。使用两个变量能比较好的解决很多相关问题,在《一维数组》和《链表》章节我们介绍了很多典型例子,于是这种方式就慢慢演化成了“双指针思想”。在数组双指针里,我们介绍过“对撞型”和“快慢型”两种方式,而滑动窗口思想其实就是快慢型的特例。滑动窗口的思想非常简单,如下图所示,假如窗口的大小是3,当不断有新数据来时,我们会维护一个大小为3的一个区间,超过3的就将新的放入老的移走。原创 2023-12-20 15:05:28 · 78 阅读 · 0 评论 -
算法通关村第十关—快速排序(青铜)
快速排序是将分治法运用到排序问题的典型例子快速排序基本思想是:通过一个标记pivot元素将n个元素的序列划分为左右两个子序列left和right,.其中left中的元素都比pivot小,right的都比pivot的大,然后再次对Ieft和right各自再执行快速排序,在将左右子序列排好序之后,整个序列就有序了。这里排序进行左右划分的时候是一直划分到子序列只包含一个元素的情况,然后再递归返回。原创 2023-12-19 11:38:36 · 297 阅读 · 1 评论 -
算法通关村第九关—二分查找模版(青铜)
一、循环二、递归。原创 2023-12-18 13:53:46 · 150 阅读 · 1 评论 -
算法通关村第十二关—字符串冲刺题(黄金)
LeetCode14 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""根据题目内容,可以很明显看出两种思路,一种是纵向比较,一种是横向比较。先看第一种的实现方法,竖着比较。纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。原创 2023-12-17 17:05:23 · 161 阅读 · 1 评论 -
算法通关村第十二关—字符串经典基础面试题(白银)
LeetCode344.题目要求:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用○()的额外空间解决这一问题。利用双指针法,left在数组左边,right在数组右边,同时向中间移动,每次交换两个指针对应的数值即可。原创 2023-12-16 21:41:38 · 141 阅读 · 1 评论 -
算法通关村第十二关—字符串转换(青铜)
LeetCode709.给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。常见ASCII范围是:a-z:97-122 A-Z:65-90 0-9:48-57。当然,做题记不住的时候可以用ASCII码对应的字符表示。toUpperCase(): 转换大小写,小变大。toLowerCase(): 转换大小写,大变小。原创 2023-12-15 21:45:11 · 158 阅读 · 1 评论 -
算法通关村第十三关—数论问题(黄金)
辗转相除法又叫做欧几里得算法,是公元前300年左右的希腊数学家欧几里得在他的著作《几何原本》提出的。最大公约数(greatest common divisor,简写为gcd),是指几个数的共有的因数之中最大的一个,例如8和12的最大公因数是4,记作gcd(8,12)=4。辗转相除法最重要的规则是,若r是a÷b的余数,则gcd(a,b)=gcd(b,r)。循环实现代码递归实现代码。原创 2023-12-14 17:21:00 · 111 阅读 · 1 评论 -
算法通关村第十三关—数字与数学高频问题(白银)
解决n次幂运算的通用方法1.排除小于等于0的数2.当该数取模n等于0时,循环除以n,直至除不了3.返回判断该数是否等于1。原创 2023-12-13 15:38:53 · 141 阅读 · 0 评论 -
算法通关村第十三关—数学与数学基础问题(青铜)
LeetCode1822给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是0返回0。题目比较简单,正数对结果完全没影响,只需判断有多少个负数和是否有0即可。原创 2023-12-12 16:10:54 · 215 阅读 · 0 评论 -
算法通关村第八关—二叉树的经典算法题(青铜)
双指针就是定义了两个变量,在二叉树中有时候也需要至少定义两个变量才能解决问题,这两个指针可能针对一棵树,也可能针对两棵树,姑且也称之为“双指针”吧。一般是与对称、反转和合并等类型相关。原创 2023-12-11 17:10:43 · 109 阅读 · 0 评论 -
算法通关村第五关—LRU的设计与实现(黄金)
LeetCode146:运用你所掌握的数据结构,设计和实现一个LRU(最近最少使用)缓存机制关于什么是LRU,简单来说就是当内存空间满了,不得不淘汰某些数据时(通常是容量已满),选择最久未被使用的数据进行淘汰。这里做了简化,题目让我们实现一个容量固定的LRUCache。如果插入数据时,发现容器已满时,则先按照LRU规则淘汰一个数据,再将新数据插入,其中「插入」和「查询」都算作一次“使用”。最近最少使用算法(LRU)是大部分操作系统为最大化页面命中率而广泛采用的一种页面置换算法。原创 2023-12-10 11:24:17 · 141 阅读 · 1 评论 -
算法通关村第四关—表达式问题(黄金)
计算器也是非常常见的问题,我们看一个中等问题。LeetCode227.给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在[-231,231-1]的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如eval()。解决运算器问题,最好的工具就是栈。原创 2023-12-09 11:15:47 · 104 阅读 · 1 评论 -
算法通关村第三关—继续讨论数据问题(黄金)
Leetcode 169.多数元素 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2(题目保证出现该数)剑指offer中的类似题目条件增加:如果该数不存在,则输出0。首先,用排序行不行?这里说一定存在出现次数超过一半的数字了,那么先对数组进行排序。在一个有序数组中次数超过一半的必定是中位数,所以可以直接取出中位数。原创 2023-12-08 20:28:43 · 74 阅读 · 0 评论 -
算法通关村第三关—双指针思想及其应用(白银)
这里介绍一种简单但非常有效的方式一双指针。所谓的双指针其实就是两个变量,不一定真的是指针。双指针思想简单好用,在处理数组、字符串等场景下很常见。看个例子,从下面序列中删除重复元素[1,2,2,2,3,3,3,5,5,7,8],重复元素只保留一个。删除之后的结果应该为[1,2,3,5,7,8]。我们可以在删除第一个2时将将其后面的元素整体向前移动一次,删除第二个2时再将其后的元素整体向前移动一次,处理后面的3和5都一样的情况,这就导致我们需要执行5次大量移动才能完成,效率太低。原创 2023-12-07 18:21:17 · 163 阅读 · 1 评论 -
算法通关村第二关—K个一组反转(黄金)
LeetCode25.给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。原创 2023-12-06 14:27:06 · 165 阅读 · 0 评论 -
算法通关村第二关—链表反转的拓展问题(白银)
LeetCode92:给你单链表的头指针head和两个整数left和right,其中left原创 2023-12-05 21:23:44 · 89 阅读 · 0 评论 -
算法通关村第七关—迭代实现二叉树的遍历(黄金)
前序遍历是中左右,如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码:(注意代码中,空节点不入栈)原创 2023-12-03 16:30:49 · 383 阅读 · 0 评论 -
算法通关村第七关—理解二叉树的遍历(白银)
从图中可以看到,当root的一个子树为null的时候还是会执行递归,进入之后发现root==null了,然后就开始返回。这里我们要特别注意res.add)的时机对不对,将其进入顺序依次写出来就是需要的结果。该过程明确之后再debug就容易很多,刚开始学习递归建议多画几次,熟悉之后就不必再画了。前序遍历写出来之后,中序和后序遍历就不难理解了,中序是左中右,后序是左右中。递归的过程如下图所示。原创 2023-12-03 13:28:38 · 89 阅读 · 0 评论 -
算法通关村第四关—栈的经典算法问题(白银)
首先看题目要求,LeetCode20.给定一个只包括’(‘,)’,‘{,’,[,]'的字符串s,,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。emsp;本题麻烦的是如何判断两个符号是不是一组的,可以用哈希表将所有符号先存起来,左半边做key,右半边做value。遍历字符串的时候,遇到左半边符号就入栈,遇到右半边符号就与栈顶的符号比较,不匹配就返回false当时自己写的时候不会用栈,用list集合代替,也可以解出来。原创 2023-12-02 21:18:34 · 117 阅读 · 1 评论 -
算法通关村第四关—理解栈手写栈(青铜)
栈和队列是比较特殊的线性表,又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现。理论上递归能做的题目栈都可以,只是有些问题用栈会非常复杂。栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行。一般而言,把允许操作的一端称为栈顶(Toρ),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈。原创 2023-12-02 18:02:43 · 112 阅读 · 0 评论 -
算法通关村第三关—数组基本操作(青铜)
创建初始化。原创 2023-12-02 16:15:38 · 127 阅读 · 0 评论 -
算法通关村第七关—理解递归(青铜)
递归类似数学里的递推,设计递归就是努力寻找数学里的递推公式,例如阶乘的递推公式就是f()=n*f(n-1),很明显一定是要触底之后才能反弹。再比如斐波那契数列的递归公式为f(n)=f(n-1)+f(n-2),n也在不断缩小。这条规律可以辅助我们检查自己写的递推公式对不对。原创 2023-12-02 14:24:17 · 97 阅读 · 0 评论 -
算法通关村第六关—二叉树的层次遍历经典问题(白银)
广度优先遍历又称层次遍历,过程如下:层次遍历就是从根节点开始,先访问根节点下面一层全部元素,再访问之后的层次,图里就是从左到右一层一层的去遍历二叉树,先访问3,之后访问的左右子孩子9和20,之后分别访问9和20的左右子孩子[8,13]和[15,17],最后得到结果[3,9,20,8,13,15,17]。这里的问题是怎么将遍历过的元素的子孩子保存一下呢,例如访问9时其左右子孩子8和13应该先存一下,直到处理20之后才会处理。原创 2023-12-01 22:45:27 · 179 阅读 · 0 评论 -
算法通关村第六关—序列恢复二叉树(青铜)
给定序列恢复二叉树(1)前序:1 2 3 4 5 6 8 7 9 10 11 12 13 15 14(2)中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 123)后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1。原创 2023-11-30 20:36:28 · 161 阅读 · 0 评论 -
算法通关村第五关—队栈和Hash的经典问题(白银)
栈是先进后出,队列是先进先出,所以可以使用两个栈来实现队列的功能。请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):思路:(1)一个栈作为输入栈,支持push操作,一个栈作为输出栈,支持pop和peek操作(2)每次pop或peek时,如果输出栈为空,则把输入栈的元素弹出并压入输出栈,此时输出栈从栈顶到栈尾的顺序就是队列从队首道队尾的顺序。原创 2023-12-01 11:22:33 · 135 阅读 · 0 评论 -
算法通关村第五关—Hash基础知识(青铜)
哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。很多人可能想不明白,这里的映射到底是啥意思,为啥访问的时间复杂度为O(1)?我们只要看存的时候和读的时候分别怎么映射的就知道了。我们现在假设数组array存放的是1到15这些数,现在要存在一个大小是7的Hash表中,该如何存呢?原创 2023-11-30 21:11:03 · 180 阅读 · 0 评论