算法
内推小仙女
字节跳动靠谱内推达人~ 校招实习社招,字节全岗位都可内推哦~ 欢迎找我内推!
展开
-
剑指offer之按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路所谓“之字形”打印,第一行是从左到右打印,第二行是从右到左打印,第三行又是从左到右打印…. 即,奇数行(根为第一行)是从左到右打印,而偶数行是从右到左打印。方法一:栈(推荐)每行的节点的访问顺序是相反的,我们可...原创 2018-04-22 12:18:19 · 186 阅读 · 0 评论 -
剑指offer之序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树解题思路二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(...原创 2018-04-22 14:49:15 · 294 阅读 · 0 评论 -
剑指offer之二叉搜索树的第k个结点
题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。解题思路二叉搜索树的一个重要性质就是它的中序遍历是排序的,因此这道题目只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第K大结点。 中序遍历用递归实现比较容易,但要想清楚的是遍历到一个根结点的时候要做的是什么? 中序...原创 2018-04-22 15:46:13 · 104 阅读 · 0 评论 -
剑指offer之数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路问题本身不难,关键在于采取哪种数据结构和算法: (1)如果用未排序的数组实现,那么插入的时间复杂度为O(1),查找的时间复杂度为O(n)(半快速排序法); (2)如果是排序的...原创 2018-04-22 17:12:19 · 257 阅读 · 0 评论 -
剑指offer之不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2;第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果;第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步...原创 2018-04-18 18:34:57 · 135 阅读 · 0 评论 -
剑指offer之把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0解题思路考虑输入的字符串是否是NULL...原创 2018-04-18 19:18:01 · 98 阅读 · 0 评论 -
剑指offer之滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6]...原创 2018-04-23 08:26:49 · 142 阅读 · 0 评论 -
剑指offer之矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字...原创 2018-04-23 09:19:59 · 161 阅读 · 0 评论 -
剑指offer之连续子数组的最大和
连续子数组的最大和 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠...原创 2018-04-13 21:17:53 · 193 阅读 · 0 评论 -
剑指offer之机器人的运动范围
题目描述 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路采用回溯法 机器人...原创 2018-04-23 20:10:27 · 157 阅读 · 0 评论 -
剑指offer之正则表达式
题目描述 请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配解题思路递归实现每次分别在str 和pattern中取一个字符进行匹配,...原创 2018-04-21 16:54:34 · 178 阅读 · 0 评论 -
剑指offer之删除链表中重复的结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路需要两个指针,一个指向前一个节点pre,另一个指向当前节点p,如果遇到相等的节点,pre不动,p向后移动,直到遇到p和p.next不相等,p...原创 2018-04-21 21:16:28 · 84 阅读 · 0 评论 -
剑指offer之二叉树的下一个结点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路 1、若该结点存在右子树:则下一个结点为右子树最左子结点(如图节点 B、C、E ) 2、若该结点不存在右子树: (1)该节点为父结点的左子结点,则下一个节点为其父结点(如图节点 D、H、F ) (2)该节点为父结点的右子结...原创 2018-04-21 21:49:51 · 84 阅读 · 0 评论 -
二分搜索法Binary Search小结
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,具有很大的应用场景,而在LeetCode中,要运用二分搜索法来解的题目也有很多,但是实际上二分查找法的查找目标有很多种,而且在细节写法也有一些变化。根据查找的目标不同,将二分查找法主要分为以下四类:第一类: 需查找和目标值完全相等的数这是最简单的一类,也是我们最开始学二分查找法需要解决的问题,比如...转载 2018-04-26 11:51:37 · 296 阅读 · 0 评论 -
设计一个最优算法来查找一n个元素数组中的最大值和最小值
题目描述有一个算法,查找n个元素的的数组的最大值和最小值,要比较2n次;请写一个最高效的算法,并说明他要比较的次数。请注意复杂度的常数 (不用写代码,说明步骤和过程即可,要定出比较的次数,没写不给分)解题思路先遍历一遍数组,两个两个分成一组,小的放在左边大的放在右边,这样比较次数是N/2。N是数组的长度。然后最小的元素一定是在每组的左边,最大的元素在右边。下一步在左边的所有元素中比较...原创 2018-05-04 19:58:33 · 15323 阅读 · 0 评论 -
动态规划经典问题总结
1.硬币找零 假设有几种硬币,如1、3、5,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。 这是一道经典的动态规划方法,我们可以维护一个一维动态数组dp,其中dp[i]表示钱数为i时的最小硬币数的找零,递推式为:dp[i] = min(dp[i], dp[i - coins[j]] + 1); 其中coins[j]为第j个硬币,而i - coins[j]为钱数i减去...原创 2018-06-08 19:25:53 · 13414 阅读 · 0 评论 -
剑指offer之扑克牌顺子
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为...原创 2018-04-18 14:47:55 · 150 阅读 · 0 评论 -
快慢指针应用总结
快慢指针 快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。快慢指针的应用(1)判断单链表是否存在环 如果链表存在环,就好像操场的跑道是一个环形一样。此时让快慢指针都从链表头开始遍历,快指针每次向前移动两个位置,慢指针每次向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,没有环。如果快指针追上慢指...原创 2018-04-06 16:54:58 · 21647 阅读 · 12 评论 -
剑指offer之重建二叉树(JAVA)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路这个构造过程是一个递归的过程。1.先求出根节点(前序序列第一个元素)。2.将根节点带入到中序遍历序列中求出左右子树的中序遍历序列。3.通过左右子树的...原创 2018-04-08 16:28:57 · 1500 阅读 · 0 评论 -
剑指offer之旋转数组的最小数字(JAVA)
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解题思路思路一: 这是一道二分查找的变形的题目。旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的...原创 2018-04-09 14:22:52 · 1071 阅读 · 0 评论 -
剑指offer之调整数组顺序使奇数位于偶数前面(JAVA)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路 最简单的想法,不考虑时间复杂度,从头扫描这个数组,每碰到一个偶数时,先取出这个数,然后把它后面的数字都往前面移动一位,这样最后空出一位放该偶数即可。但显然这样会重复移动很多次,这种解法显然是...原创 2018-04-10 14:54:12 · 219 阅读 · 0 评论 -
剑指offer之树的子结构(JAVA)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路1、首先设置标志位result = false,因为一旦匹配成功result就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false 2、递归思想 - 如果根节点相同则递归调用DoesTree1HaveTree2() - 如果根节点不相同,则判断...原创 2018-04-10 15:36:51 · 161 阅读 · 0 评论 -
剑指offer之顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路把打印一圈分为四步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从...原创 2018-04-10 18:54:09 · 153 阅读 · 0 评论 -
剑指offer之丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路首先最容易想到的方法就是暴力破解,思路非常简单,首先除2,直到不能整除为止,然后除5到不能整除为止,然后除3直到不能整除为止。最终判断剩余的数字是否为1,如果是1则为丑数,否则不是丑数。 ...原创 2018-04-16 11:53:35 · 121 阅读 · 0 评论 -
剑指offer之二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路递归解法可以将输入序列划分为3部分,即left、right、root,首先找到left部分最后一个结点的下标,即可完成分隔。如果left部分和right部分均是BST,即可递归调用VerifySquenceOfBST(...原创 2018-04-11 13:40:37 · 151 阅读 · 2 评论 -
剑指offer之二叉树中和为某一值的路径
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。解题思路由于路径是从根结点出发到叶结点,也就是说路径总是以根结点为起始点,因此我们首先需要遍历根结点,只有前序遍历是以根结点出发的,我们每访问到一个结点的时候,就把当前的结点添加到路径中去。而每一次当从子结点回到父结点的时候,我们都...原创 2018-04-11 14:35:03 · 150 阅读 · 0 评论 -
剑指offer之整数中1出现的次数(从1到n整数中1出现的次数)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解题思路考虑将n的十进制的每一位单独拿出讨论,每一位的值记为weight。1) 个...转载 2018-04-17 10:50:43 · 117 阅读 · 0 评论 -
剑指offer之字符串的排列
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 解题思路如果能生成n-1个元素的全排列,就能生成n个元素的全排列。对于只有一个元素的集合,可以直接生成全排列。所以全排列的递归终止条件很明确,只有一个元素时。我们可以分析一下全排列的过程:...原创 2018-04-11 20:51:19 · 143 阅读 · 0 评论 -
剑指offer之数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路1.全面考察指数的正负、底数是否为零等情况。 2.写出指数的二进制表达,例如11表达为二进制1011。 3.举例:10^1011 = 10^0001*10^0010*10^1000。 4.通过&1和>>1来逐位读取1011,为1...原创 2018-04-11 22:07:35 · 70 阅读 · 0 评论 -
剑指offer之复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解题思路思路一:把复制过程分成两步:第一步复制原始链表上的每一个结点,并用next链接起来;第二步设置每个结点的random 指针。这样一来,对于...原创 2018-04-12 09:37:05 · 158 阅读 · 0 评论 -
剑指offer之数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路方法一:异或除了有两个数字只出现了一次,其他数字都出现了两次。异或运算中,任何一个数字和自己本身异或都是0,任何一个数字和0异或都是本身。 如果尝试把原数组分成两个子数组,且刚好每个子数组中各自包含一个只出现一次的数字。则在该前提下,每个子数组中,只有一个数字...原创 2018-04-17 18:43:38 · 1036 阅读 · 0 评论 -
剑指offer之和为S的两个数字 vs 和为S的连续正数序列
一、和为S的两个数字题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,...原创 2018-04-17 20:13:23 · 166 阅读 · 0 评论 -
剑指offer之左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路方法一:假设字符串abcXYZdef,我们将两个该字符串结合,即“...原创 2018-04-17 20:39:53 · 165 阅读 · 0 评论 -
剑指offer之对称的二叉树
题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路 提到二叉树,想到的就是三种不同二叉树的遍历方法,即前序遍历、中序遍历和后序遍历。在这三种遍历算法中,都是先遍历左子结点在遍历右子结点。评定是否为一颗对称树,最好想到的就是前序遍历,如果我们在定义一种类似于前序遍历的遍历方法:即先遍历父结点,再遍历...原创 2018-04-22 11:20:13 · 160 阅读 · 0 评论 -
剑指offer之从尾到头打印链表(JAVA)
题目描述输入一个链表,从尾到头打印链表每个节点的值。解题思路方法一:借助堆栈的“后进先出”结构/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }...原创 2018-04-08 15:22:39 · 496 阅读 · 0 评论