算法村
文章平均质量分 70
陈星泽_Star
星辰浩瀚,泽润四方。
展开
-
动态规划高频问题(算法村第十九关白银挑战)
本方法假定第一个格子无障碍物的情况下,第一列均可达,而这有根本性错误:第一列的其他行可能存在障碍物,此时不可达。已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。换句话说,其值等于一个整数自乘的积。数组中的每个元素代表你在该位置可以跳跃的最大长度。= 1,合理,因为用一个数字只能构成一种解码方案。在「杨辉三角」中,每个数是它左上方和右上方的数的和。所以,对每个格子,都要先判断是否有障碍物,再对其。原创 2024-05-16 09:26:23 · 454 阅读 · 1 评论 -
详解动态规划(算法村第十九关青铜挑战)
这个题目涵盖了dp的多个方面,比如重复子问题(递归)、记忆化搜索(将已经计算好的结果存入数组,后面用到就直接读取)、滚动数组(二维数组优化为一维数组)。原创 2024-03-03 19:50:11 · 1179 阅读 · 0 评论 -
回溯难题(算法村第十八关黄金挑战)
考虑到构造IP地址时还要手动给添加三个小数点,所以我们用变量。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。的字符串,返回所有它能表示的字母组合。,用以表示一个 IP 地址,返回所有可能的。正好由四个整数(每个整数位于。之间组成,且不能含有前导。给定一个只包含数字的字符串。IP地址只有四段,所以将。说明字符串分成了4段了。,这些地址可以通过在。分割的段数 == 4。原创 2024-03-03 13:51:57 · 520 阅读 · 0 评论 -
回溯热门问题(算法村第十八关白银挑战)
当我们用小写字符的ASCII码值与32进行异或操作时,第五位(从右向左数,起始位为第零位)会翻转,因为32的二进制表示中只有第五位是1。当我们用大写字符的ASCII码值与32进行异或操作时,同样地,第五位会翻转,我们就得到了对应的小写字符的ASCII码值。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。O(n)为判断回文串的开销,O(n ^ 2)为枚举所有子串的开销(一个集合的所有子集个数)。例如,大写的’A’的ASCII码值是65,其二进制表示为。原创 2024-03-02 15:36:55 · 923 阅读 · 0 评论 -
回溯是怎么回事(算法村第十八关青铜挑战)
返回所有从根节点到叶子节点的路径。路径总和等于给定目标和的路径。给你一个二叉树的根节点。是指没有子节点的节点。是指没有子节点的节点。原创 2024-03-01 11:56:05 · 417 阅读 · 0 评论 -
跳跃游戏问题(算法村第十七关黄金挑战)
其实不用关心跳几步,怎么跳,而是要关心最大的跳跃范围能不能覆盖到终点。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回。向前跳转的最大长度。生成的测试用例可以到达。处,你可以跳转到任意。给你一个非负整数数组。原创 2024-02-29 10:00:03 · 503 阅读 · 0 评论 -
贪心高频问题(算法村第十七关白银挑战)
二维数组实际上是一个数组的数组,因此不能直接删除其中的元素。但是,我们可以通过创建一个新的二维数组,将原数组中除了要删除的元素之外的所有元素复制到新数组中,从而实现删除元素的效果。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。大致思路比较简单,但还需要一些比较细致巧妙的代码处理,比较边界的过程就体现了贪心的思想。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。原创 2024-02-27 20:57:20 · 782 阅读 · 0 评论 -
贪心算法入门题(算法村第十七关青铜挑战)
贪心算法(贪婪算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优的选择,从而希望能够导致结果是最好或者最优的算法。贪心算法要么得到最优解,要么得到近似最优解。贪心的题目没有固定的套路,一题一法,好在大部分的贪心算法题不是特别难,因此公认的贪心学习法则是“直接做题,不考虑贪不贪心”。原创 2024-02-07 11:59:20 · 1442 阅读 · 0 评论 -
堆与滑动窗口的结合(算法村第十六关黄金挑战)
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口每次只向右移动一位。原创 2024-02-06 11:21:14 · 472 阅读 · 0 评论 -
滑动窗口经典问题(算法村第十六关白银挑战)
向内收缩的过程中,两板距离一定减小,收缩短板一侧可能使短板变长板,原来的长板成为新的短板,从而使面积增大;但收缩长板一侧并不能改变原来的短板,甚至可能会使长板变短板,导致面积进一步减小。所以我们只有在遍历的过程中,不断收缩短板一侧即可,同时记录最大盛水容量(面积),并返回其长度**。**如果不存在符合条件的子数组,返回。的子串,返回这些子串的起始索引。指由相同字母重排列形成的字符串(包括相同的字符串)。字符的最长子串,并返回该子串的长度。轴共同构成的容器可以容纳最多的水。的最长子串,并返回该子串的长度。原创 2024-02-06 10:02:14 · 821 阅读 · 0 评论 -
滑动窗口入门(算法村第十六关青铜挑战)
最后一个问题,那双指针和滑动窗口有啥区别?滑动窗口是双指针的一种类型,主要关注两个指针之间元素的情况,因此范围更小一些,而双指针的应用范围更大,花样也更多。原创 2024-01-31 10:14:46 · 467 阅读 · 0 评论 -
超大规模数据场景的问题(算法村第十五关黄金挑战)
这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到内存里,因此我们只能将文件划分成一些块,每块大小是 x MB,x就是可用内存的大小,例如1GB一块,那我们就可以将文件分为20块。首先遍历10亿个数字找最小,然后再遍历一次找第二小,然后再一次找第三小,直到找到第100万个。然后遍历整个序列,只有比堆顶元素小的才允许插入堆中,并删除原堆的最大元素。之后继续遍历剩下的数字,最后剩下的就是最小的100万个。堆排序也称为外部排序。设计一个算法,给定一个10亿个数字,找出最小的100万个的数字。原创 2024-01-31 09:09:47 · 327 阅读 · 0 评论 -
海量数据场景下的热门算法题(算法村第十五关白银挑战)
对每一台机器来说,如果分到的数据量依然很大,比如,内存不够或存在其他问题,可以再用哈希函数把每台机器的分流文件拆成更小的文件处理。处理每一个小文件的时候,通过哈希表统计每种词及其词频,哈希表记录建立完成后,再遍历哈希表,遍历哈希表的过程中使用大小为100的小根堆来选出每一个小文件的Top100(整体未排序的Top100)。总之,牢记一点,很多大数据问题都离不开分流,要么是用哈希函数把大文件的内容分配给不同的机器,要么是用哈希函数把大文件拆成小文件,然后处理每一个小数量的集合。原创 2024-01-25 18:47:15 · 889 阅读 · 0 评论 -
海量数据场景下的热门算法题(算法村第十五关白银挑战)
对每一台机器来说,如果分到的数据量依然很大,比如,内存不够或存在其他问题,可以再用哈希函数把每台机器的分流文件拆成更小的文件处理。处理每一个小文件的时候,通过哈希表统计每种词及其词频,哈希表记录建立完成后,再遍历哈希表,遍历哈希表的过程中使用大小为100的小根堆来选出每一个小文件的Top100(整体未排序的Top100)。总之,牢记一点,很多大数据问题都离不开分流,要么是用哈希函数把大文件的内容分配给不同的机器,要么是用哈希函数把大文件拆成小文件,然后处理每一个小数量的集合。原创 2024-01-25 18:46:27 · 1223 阅读 · 0 评论 -
用4KB内存寻找重复元素(算法村第十五关青铜挑战)
在海量数据中,普通的数组、链表、Hash、树等等结构无效,因为内存空间不足。而常规的递归、排序,回溯、贪心和动态规划等思想也无效,因为执行超时。这类问题该如何下手呢?这里介绍三种非常典型的思路:1.使用位存储。使用位存储最大的好处是占用的空间是简单存整数的1/8。例如一个40亿的整数数组,如果用整数存储需要16GB左右的空间,而如果使用位存储,就可以用0.5GB的空间,这样很多问题就能够解决了。2.外部排序。原创 2024-01-25 11:08:51 · 490 阅读 · 0 评论 -
数据流的中位数(算法村第十四关黄金挑战)
是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。原创 2024-01-25 09:15:01 · 415 阅读 · 0 评论 -
堆能高效解决的经典问题(算法村第十四关白银挑战)
中元素的默认排序是升序排序。这意味着队列头部的元素(堆顶元素)将是最小的元素。先将每个链表的头节点放入小根堆,出来一个再放入下一个,这样可以维持一个小堆,减少堆的自我排序时间,也将原先的空间复杂度。第 K 个最大元素,就是在数组排序以后,后 K 个元素中最小的元素。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。请注意,你需要找的是数组排序后的第。找第K大用小根堆,找第K小用大根堆。你必须设计并实现时间复杂度为。个最大的元素,而不是第。原创 2024-01-24 21:46:02 · 374 阅读 · 0 评论 -
堆结构(算法村第十四关青铜挑战)
堆结构是一种非常重要的基础数据结构,也是算法的重要内容,很多题目甚至只能用堆来进行。由于堆的构造和维护过程都非常复杂,因此面试时一般不需要手写堆的实现过程,但是java、python、C++已经提供了一些工具,因此需要知道思路就可以。本关主要介绍堆如何增删改查的,不用管代码怎么写,后面再介绍如何使用堆来解决问题。原创 2024-01-24 18:36:41 · 536 阅读 · 0 评论 -
数论问题(算法村第十三关黄金挑战)
对 n 反复除以 2,3,5,直到 n 不再包含质因数 2,3,5。若剩下的数等于 1,则说明 n 不包含其他质因数,n是丑数;否则,说明n包含其他质因数,n不是丑数。当 n>0 时,若 n 是丑数,则 n 可以写成 n = 2^a + 3^b + 5^c 的形式,其中 a,b,c 都是非负整数。一般来说题目里 n 的规模达到 10^5 及以上时,需要实现的程序的时间复杂度最高只能是 O(n logn)特别地,当 a,b,c 都是 0 时,n=1。根据丑数的定义,0 和负整数不是丑数。空间复杂度:O(1)原创 2024-01-24 17:49:55 · 410 阅读 · 0 评论 -
数字与数学高频问题(算法村第十三关白银挑战)
正整数 n 是 2 的幂,当且仅当 n 的二进制表示中只有最高位是 1,其余位都是 0。给定一个整数,写一个函数来判断它是否是 3 的幂次方。给定一个整数,写一个函数来判断它是否是 4 的幂次方。2的幂次方的特点:整除2后是偶数,不断整除2的结果是1。,请你判断该整数是否是 2 的幂次方。数组所表示的非负整数,在该数的基础上加一。,以二进制字符串的形式返回它们的和。是 3 的幂次方需满足:存在整数。是 4 的幂次方需满足:存在整数。一定是最大的3的幂次方的除数。是3的幂次方,则整型范围内。原创 2024-01-24 15:04:04 · 563 阅读 · 0 评论 -
数字与数学的基础问题(算法村第十三关青铜挑战)
数学的门类很多,涉及的范围很广,很多难度也超大,但是在算法中,一般只会选择各个学科的基础问题来考察,例如素数问题、幂、对数、阶乘、幂运算、初等数论、几何问题、组合数学等等。原创 2024-01-23 22:00:40 · 1006 阅读 · 0 评论 -
字符串冲刺题(算法村第十二关黄金挑战)
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个。**进阶:**如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用。修改输入数组**、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须**它的第一个不重复的字符,并返回它的索引。是由非空格字符组成的字符串。**注意:**输入字符串。原创 2024-01-23 16:08:49 · 540 阅读 · 0 评论 -
字符串经典基础面试题(算法村第十二关白银挑战)
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个。**进阶:**如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用。修改输入数组**、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须**它的第一个不重复的字符,并返回它的索引。是由非空格字符组成的字符串。**注意:**输入字符串。原创 2024-01-21 16:30:10 · 840 阅读 · 0 评论 -
不简单的字符串转换问题(算法村第十二关青铜挑战)
这个问题其实没有考察算法的知识,模拟的是日常开发中对于原始数据的处理(例如「参数校验」等场景),如果面试中遇到类似的问题,应先仔细阅读题目文字说明和示例,有疑惑的地方和需要和面试官确认,在编码的时候需要耐心和细心地调试。3、不得不写得比较繁琐、冗长的时候,需要写清楚注释、体现逻辑层次,以便上线以后排查问题和后续维护。1、有现成的工具和类库需尽量使用,因为它们是性能更优,且经过更严格测试,是相对可靠的;,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。大写字母和小写字母的值之间存在固定的差异。原创 2024-01-21 13:04:58 · 676 阅读 · 0 评论 -
位运算的高频算法题(算法村第十一关白银挑战)
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为。写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。颠倒给定的 32 位无符号整数的二进制位。中,此时便将最低位颠倒到了最高位。的最低位(每轮右移一位),如此循环,直到。**提示:**保证乘法范围不会溢出。让原始数据不断左移一位,通过与。,计算其二进制表示中 1。(系统会自动转变为二进制),计算并返回两整数之和。,便得到颠倒后的十进制数。原创 2024-01-19 12:50:31 · 314 阅读 · 0 评论 -
位运算的规则(算法村第十一关青铜挑战)
参与运算的两数各对应的二进位相异或,当对应的2个二进位相异时,结果位为1,相同则结果位为0。按二进制形式把所有的数字向右移动对应的位数,低位舍弃,高位补符号位(即正数补零,负数补1)。参与运算的两数对应的二进位相与,只有对应的2个二进位均为1时,结果位才为1 ,否则为0。参与运算的两数对应的二进位相或,只要对应的2个二进位有一个为1时,结果位就为1。按二进制形式把所有的数字向左移动对应的位数,高位舍弃,低位补零。需要移位的数字 > 移位的次数。0110(6的二进制)原创 2024-01-18 17:21:58 · 427 阅读 · 0 评论 -
实现归并排序(算法村第十关黄金挑战)
【代码】实现归并排序(算法村第十关黄金挑战)原创 2024-01-18 15:57:02 · 638 阅读 · 0 评论 -
数组中第K个最大元素(算法村第十关白银挑战)
给定整数数组nums和整数k,请返回数组中第**k**个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。原创 2024-01-17 18:08:16 · 387 阅读 · 0 评论 -
清晰易懂学透快速排序(算法村第十关青铜挑战)
【代码】清晰易懂学透快速排序(算法村第十关青铜挑战)原创 2024-01-17 13:25:34 · 459 阅读 · 0 评论 -
两道有挑战的问题(算法村第九关黄金挑战)
构造一棵二叉搜索树时,升序序列中的任一个元素都可以作为根节点,然后以该元素左边的升序序列构建左子树,以该元素右边的升序序列构建右子树。本题要求高度平衡,因此需要选择升序序列的中间元素作为根节点,这本质上就是二分查找的过程。二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。排列,请你将其转换为一棵。原创 2024-01-17 11:25:56 · 349 阅读 · 0 评论 -
二分查找与搜索树的高频问题(算法村第九关白银挑战)
剑指 offer :一个长度为 n - 1 的递增排序数组中的所有数字都是唯一的,每个数字的范围都是 [0,n-1]。在范围 0~n-1 内的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。二叉搜索树「中序遍历」序列是升序的,所以我们在中序遍历时,实时检查当前节点的值是否大于前一个节点的值即可。下面两棵树的中序序列分别是{3,6,9,10,14,16,19},{3,6,9,10},因此都是搜索树。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。的数组,预先按照升序排列,经由。原创 2024-01-15 16:11:54 · 1072 阅读 · 0 评论 -
逢试必考的二分查找(算法村第九关青铜挑战)
意思是二进制数的每个位右移 x 位。从十进制的角度看, x 是以 2 为底的指数,这个指数就是除数。,所以需要使用括号来保证正确的优先级。除法在计算机中效率很低,一般改用。在 Java 中,位运算符。的优先级低于加法运算符。原创 2024-01-12 11:25:55 · 486 阅读 · 0 评论 -
二叉树的最近公共祖先(算法村第八关黄金挑战)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大([2, 105]Node.val互不相同p!= qpq。原创 2024-01-11 12:46:32 · 523 阅读 · 0 评论 -
二叉树的深度和高度问题(算法村第八关白银挑战)
对于根节点,它到叶结点的最大深度 = 1 + max(左节点的最大深度,右节点的最大深度)。最大深度也即二叉树的层数,所以我们可以采用层序遍历的方法,每遍历完一层就记录二叉树的层数。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。是指从根节点到最远叶子节点的最长路径上的节点数。给定一个二叉树,判断它是否是高度平衡的二叉树。的左右两个子树的高度差的绝对值不超过 1。**说明:**叶子节点是指没有子节点的节点。给定一个二叉树,找出其最小深度。原创 2024-01-11 10:23:34 · 913 阅读 · 0 评论 -
二叉树的深度和高度问题(算法村第八关白银挑战)
对于根节点,它到叶结点的最大深度 = 1 + max(左节点的最大深度,右节点的最大深度)。所以,我们只需递归地求当前结点到叶结点的最大深度即可。最大深度也即二叉树的层数,所以我们可以采用层序遍历的方法,每遍历完一层就记录二叉树的层数。是指从根节点到最远叶子节点的最长路径上的节点数。给定一个二叉树,判断它是否是高度平衡的二叉树。的左右两个子树的高度差的绝对值不超过 1。原创 2024-01-07 18:38:17 · 619 阅读 · 0 评论 -
二叉树的经典算法(算法村第八关青铜挑战)
若当前节点不是叶子节点,则递归地询问它的两个子节点是否满足条件 val == targetSum - 父节点.val ,有一个满足即返回 true,两个都不满足则返回 false (子节点为 null 视为不满足)。两个二叉树同时进行前序遍历,先判断根节点是否相同, 如果相同再分别判断左右子树是否相同,判断的过程中只要有一个不相同就返回 false,全部相同才会返回true。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;,返回所有从根节点到叶子节点的路径。原创 2024-01-07 16:50:58 · 1258 阅读 · 0 评论 -
迭代实现二叉树的遍历(算法村第七关黄金挑战)
将后序遍历序列反转后得到的序列是“中右左”,而前序遍历序列是“中左右”。所有,我们将前序遍历的遍历次序改变一下,再把结果完全反转,即可得到所要的后序遍历序列。中序遍历是左中右,先访问二叉树左子树的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(把节点的val放进 answer 列表中)首先创建一个 Stack 用来存放节点,此时 Stack 为空,优先将根结点加入 Stack,然后进行相关处理(打印、加入列表等等)。所以先加入 Stack 的应该是右子树,然后左子树。原创 2024-01-06 15:07:55 · 497 阅读 · 0 评论 -
理解二叉树的遍历(算法村第七关白银挑战)
LeetCode以及面试中提供的方法可能无法直接用来递归,此时需要我们再创建一个方法。原创 2024-01-05 16:48:53 · 526 阅读 · 0 评论 -
一图理解递归(算法村第七关青铜挑战)
从n=3开始都满足f(n)= f(n-1) + f(n-2),然后我们再选择某个比较大的n来验证即可。所以,在面试时千万不要上来就写,而应该先和面试官讨论你的设计方案。解决这类问题最直接的方式就是枚举,将可能的情况列举一下,再逐步优化。递归经常能看到很多骚操作代码,不要迷信这些,先分情况逐个先写出来,之后再看能否精简优化。先考虑清楚什么情况下终止,并把相关代码写在靠前位置的,之后再考虑递归的逻辑,这样可以降低编写的难度。先猜测出存在递归关系,再选几个较小的值验一下,有必要的话再选择几个比较大的验一下。原创 2024-01-05 16:31:08 · 352 阅读 · 0 评论 -
二叉树的层序遍历经典问题(算法村第六关白银挑战)
层序遍历顺序不变,但对当前层节点的存储,我们维护一个变量 isOrderLeft ,记录结点存储是从左至右还是从右至左。从右向左层次遍历, 最后一个访问的节点必然是最底层最左侧叶子节点。在遍历完一层节点之后,将存储该层节点值的列表 list 添加到结果列表 ans 的头部即可。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)给定一棵二叉树的根节点。原创 2024-01-05 15:39:42 · 1124 阅读 · 0 评论