
算法面试宝典
文章平均质量分 66
字节、阿里、快手、美团、京东等大厂算法面试的总结。每一个算法都从不同的维度分析可行性,比较性能,给出时间复杂度和空间复杂度,读者可以跟着文章的思路学习算法面试的解题技巧和解题思路
苏博亚
从事支付行业开发10余年,先后在美团、有赞等互联网公司负责支付业务的开发设计工作。对微服务、数据库、中台、技术架构有深入的研究。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法面试宝典】罗马数字转整数 - LeetCode13
1 算法描述罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1 。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+...原创 2021-12-19 20:40:26 · 201 阅读 · 0 评论 -
【算法面试宝典】整数转罗马数字 - LeetCode12
1 算法描述罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+...原创 2021-12-19 18:47:10 · 207 阅读 · 0 评论 -
【算法面试宝典】回文数 - LeetCode9
1 算法描述给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入:x = 121输出:true示例2:输入:x = -121输出:false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入:x = 10输出:false解释:从右向左读, 为 01 。因此它不是一.原创 2021-12-18 14:36:25 · 1780 阅读 · 0 评论 -
【算法面试宝典】盛最多水的容器 - LeetCode11
1 算法描述给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为49。示例...原创 2021-12-17 17:28:34 · 148 阅读 · 0 评论 -
【算法面试宝典】字符串转换整数 - LeetCode8
1 算法描述请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数...原创 2021-12-17 11:52:34 · 139 阅读 · 0 评论 -
【算法面试宝典】整数反转 - LeetCode7
1 算法描述给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围[−231,231− 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。示例 1:输入:x = 123输出:321示例 2:输入:x = -123输出:-321示例 3:输入:x = 120输出:21示例 4:输入:x = 0输出:0提示:-231 <= x <= 231 - 1...原创 2021-12-17 10:01:35 · 316 阅读 · 0 评论 -
【算法面试宝典】最长回文子串 - LeetCode5
1 算法描述给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd" 输出:"bb"示例 3:输入:s = "a" 输出:"a"示例 4:输入:s = "ac" 输出:"a"提示:1 <= s.length <= 1000s 仅由数字和英文字母(大写和/或小写)组成2 解题思路方案一:中心扩展法...原创 2021-12-16 18:48:54 · 431 阅读 · 0 评论 -
【算法面试宝典】无重复字符的最长子串
1 算法描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 ...原创 2021-12-09 08:56:22 · 831 阅读 · 0 评论 -
【算法面试宝典】寻找两个正序数组的中位数
1 算法描述给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 =...原创 2021-12-04 18:07:02 · 527 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 基数排序
1 解题思路基数排序的核心思想是把要比较的元素拆分,按照个位、十位、百位、千位的来拆分,然后在相同位上的数值放入从0-9的10个桶中,这样相同位上的数值就有序了,然后依次类推进行比较,最终得到排好序的元素列表。 基数排序有两种方式,一种是最高位优先(Most Significant Digit first)法,简称MSD法。一种是最低位优先(Least Significant Digit first)法,简称LSD法。示例:输入:nums = {80, 55...原创 2021-11-30 20:27:19 · 3769 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法
1 排序算法的分类 排序是将一组无序的数字元素,经过重新排列后形成的一组有序的数字元素,可以是升序也可以是降序。排序算法是对数字元素排列的过程中经过的一些列运算。根据是否需要比对,可以把排序算法分为 比较类排序算法 和 非比较类排序算法。比较类排序算法:通过比较来确定元素之间的相对顺序。比较类排序算法的时间复杂度不能突破 O(NlogN),所以也成为非线性时间比较类排序。 非比较类排序算法:不通过比较来确定元素之间的相对顺序。非比较类排序算法可以突破比较类排序算法时间复杂度的下界,以...原创 2021-11-30 20:41:23 · 527 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 桶排序
1 解题思路 桶排序是最简单的排序算法之一,桶排序和计数排序、基数排序有很多相似和渊源之处。桶排序重要的是它的思路,而不是具体的实现。不同待排序元素,桶排序的具体实现会有差异。 桶排序的工作原理是把待排序的元素放入对应的桶里。每个桶再进行单独的排序(可以是快速排序、可以是递归排序、也可以用递归的方式继续使用桶排序进行排序)。桶排序需要经过四步:1)按照元素特性设计好桶;2)把待排序元素放入对应的桶中;3)对每个桶内的元素进行排序;4)合并桶中的元素得到有序...原创 2021-11-26 16:01:39 · 3987 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 计数排序
1 解题思路 计数排序是一种非比较排序,是典型的用空间换取时间的排序算法,时间复杂度只有 O(n)。计数排序的思路非常简单:重新创建一个数据,把要排序的数组中的值作为新的数组的索引,新的数组的值是元素出现的次数,然后遍历新的数组,依次把大于0的元素的下标取出赋值到另一个数组,即为排序后的数组。计数排序的步骤:1)找出原数组 nums 中的最大值 max 。2)定义一个新的数组 int[] countNums = new int[max+1] 。3)对新的数组 countNu...原创 2021-11-22 09:07:10 · 1175 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 归并排序
1 解题思路 归并排序是使用分治策略(分治法是将大问题分成小问题,对小问题来求解,然后将分解的答案合并成大问题需要的答案)实现的排序算法,归并排序的核心思想是把数组 nums 一分为二,把分好的两个子数组分别进行排序,然后再合并两个排好的子数组得到合并后的有序数组,依次类推,直到把数组拆分的只剩一个元素,然后再依次合并。归并排序使用递归的思想,先依次拆分数组,然后再依次合并,跟快速排序某些程度上是相反的,快速排序是找目标值的位置然后拆分数组。示例:输入 nums = {9,4,5...原创 2021-11-22 09:05:13 · 269 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 堆排序
1 解题思路堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。要使用堆这种数据结构,首先要理清什么是堆?堆可以分为大顶堆和小顶堆。堆是一颗完全二叉树,每个节点的值都大于或等于左右孩子节点的值,称为大顶堆;每个节点都小于或等于左右孩子节点的值,称为小顶堆。如下图所示:如果使用数组来表示堆,我们对堆中的节点按层次编号,如下图所示:那么大顶堆和小顶堆的定义:大顶堆:nums[i]>=nums[2i+1] && nums[i]>...原创 2021-11-21 11:32:21 · 1109 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 选择排序
1 解题思路 选择排序是逻辑比较简单的一种排序算法,核心思想是遍历无序的元素找到最大或者最小值,放入有序元素的末尾。所有元素遍历一遍即把所有元素完成排序。示例:输入 nums = {4,8,1,5,9,2} 输出 nums1 = {1,2,4,5,8,9}插入排序执行步骤:第一步:初始的时候整个数组都是无序的,所以假设数组最左端的元素 4 是最小值,后面的数组依次和4比较,如果有比4小的元素,交换两个元素的位置。第一轮循环得到的数组如下所示:...原创 2021-11-21 11:30:13 · 427 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 希尔排序
1 解题思路 希尔排序是第一个算法复杂度突破 O(n^2) 的排序算法,是在插入排序的基础上做了改进,也称为缩小增量排序。希尔排序会把一个序列拆分成多个子序列,分别对多个子序列进行插入排序,然后在合并排好序的子序列,再进行整体的插入排序。子序列的拆分方法是按下标的一定增量来分组,对每一组使用插入排序进行排序,随着增量逐渐减少,每组包含的关键词逐渐增多,当增量减至1时,所有的元素都在同一个组,算法便终止。 希尔排序实现了跳跃式的比较和插入,相比直接插入排序,希尔排序针对已经...原创 2021-11-21 00:22:14 · 1202 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 插入排序
1 解题思路 给定一个无序数组 nums,使用插入排序使数组中的元素按照升序或者降序排列。插入排序的核心思路是把数组 nums 一分为二,一个是已经排好序的数组 nums1,一个是无序的数组nums2,把无序数组 nums2 中的元素,插入有序数组 nums1 中,就得到了一个有序数组,插入的时候需要通过比较值的大小来判断 nums2 中的元素(carry)放在 nums1中的哪个位置。通常是从 nums1 数组的后面开始比较,carry 从后往前和 nums1 的元素做比较,找到不小于 ...原创 2021-11-21 00:20:02 · 468 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 快速排序
2.3.1 解题思路 快速排序的核心思想是找到一个目标值 key ,使用数组 nums 中的元素和 key 进行比较,大于 key 的元素放到数组的一边,小于 key 的元素放到数组的另一边,这样 key 的位置就确定了,依次使用这种方式对两边的数组进行排序,最终得到排好序的数组。示例:输入 nums = {4,8,1,5,9,2} 输出 nums= {1,2,4,5,8,9}快速排序执行步骤:初始化:nums = {4,8,1,5,9,2}第一步:nums...原创 2021-11-17 18:47:59 · 787 阅读 · 0 评论 -
【算法面试宝典】十大经典排序算法 - 冒泡排序
1 解题思路原理:比较两个相邻的元素,将大的元素交换到右边。思路:依次比较两个相邻的元素,将小的元素放到左边,大的元素放到右边。1)第一次比较:比较第一个元素和第二个元素,将小的放到左边,大的放到右边;2)第二次比较:比较第二个元素和第三个元素,将小的放到左边,大的放到右边;…………3)依次比较相邻的两个元素,直到最后两个元素,把小的放到左边,大的放到右边,这样数组最后一个元素就是整个数组中最大的元素;4)然后开始第二轮比较,第一轮得到了最后的元素,所以最后一个元素不参与比较,第原创 2021-11-17 18:45:48 · 99 阅读 · 0 评论 -
【算法面试宝典】两数相加
1 题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807示例 2:输入:l1 = [0], l...原创 2021-10-26 23:22:24 · 107 阅读 · 0 评论 -
【算法面试宝典】两数之和
1 题目要求题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9 输出:[0,1] 。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums..原创 2021-10-26 14:30:45 · 107 阅读 · 0 评论 -
【算法面试宝典】算法的时间复杂度与空间复杂度
目录1 算法概述1.1 算法定义1.2 算法的特性1.3 算法的要素1.4 算法优劣评定2 时间复杂度2.1 时间复杂度的定义2.2 时间复杂度的计算方式2.3 常见的时间复杂度3 空间复杂度3.1 空间复杂度的定义3.2 空间复杂度的计算方式3.3 常见的空间复杂度4 小结1 算法概述1.1 算法定义 算法(Algroithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策...原创 2021-10-25 23:00:22 · 726 阅读 · 0 评论