
算法面试题
J___code
这个作者很懒,什么都没留下…
展开
-
算法面试题-二叉树序列化和反序列化
介绍二叉树如何实现序列化和反序列化(先序遍历和层次遍历)原创 2022-01-24 22:10:39 · 105 阅读 · 0 评论 -
算法面试题-二叉树的后继节点
二叉树的后继节点(非中序遍历方法)原创 2022-01-23 23:34:29 · 179 阅读 · 0 评论 -
算法面试题-最低公共祖先
最低公共祖先原创 2022-01-23 22:57:28 · 488 阅读 · 0 评论 -
算法面试题-二叉树的宽度
题目:求一棵二叉树的宽度分析: 先了解二叉树的宽度优先遍历,使用的数据结构是队列: 1.将root节点放入队列 2.将队首节点的左/右节点分别入队列,并将对首节点打印并弹出队列 3.重复步骤2直至队列为空 所以求树的宽度即在宽度优先遍历的基础上记录每一层的节点个数,需要使用hash表记录每个节点所在的层数: 1.将root节点放入队列,并用hash表记录该节点的层数为1 2.将队首节点的左/右节点分别入队列,同时将队首节点出队,并记录左/右节点层数(在队首节原创 2021-12-08 23:55:31 · 222 阅读 · 0 评论 -
算法面试题-返回链表相交节点
题目:给定两个可能有环也可能无环的单链表。实现一个函数,如果两个链表相交,请返回相交的第一个节点;不相交则返回null。如果两个链表长度之和为N,要求时间复杂度为O(N),额外空间复杂度为O(1)分析:1.首先确定两个链表是否有环(使用快慢指针方法)2.当两个链表都为无环结构: 如果两个链表相交,则相交后的部分一定是公共部分,因为如果相交后再出现分叉,则说明相交节点有两个next指针,不符合实际 并且注意假设长链表为1->2->3->4->null,短链表为1-&原创 2021-12-03 20:48:41 · 325 阅读 · 0 评论 -
算法面试题-复制随机链表
题目: 复制含有随机指针节点的链表:给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数 完成这个链表的复制,并返回复制的新链表的头节点。要求时间复杂度O(N),额外空间复杂度O(1) 新节点的定义如下: class Node { int value; Node next; Node rand; // 可能指向链表的任意一个节点,也可能指向null Node(int value) {原创 2021-12-02 21:03:38 · 213 阅读 · 0 评论 -
算法面试题-划分单链表
题目:将单向链表按某值划分为左边小、中间相等、右边大的形式,并且调整后三个部分中节点的相对位置和调整前是一样的。要求时间复杂度为O(N),额外空间复杂度为O(1)分析:方法1: 采用数组储存链表中的节点,然后采取快排中的Partition操作将数组进行排序为三个部分。但是该方法不稳定,无法满足相对位置不变,且额外空间复杂度为O(N)方法2:采取有限变量,形成三个链表1.对三个部分分别设置头指针和尾指针2.根据节点的大小对三个部分链表进行扩充3.将三个链表的头和尾进行相连代码实现:p原创 2021-12-01 21:52:04 · 326 阅读 · 0 评论 -
算法面试题-回文链表
题目:判断一个链表是否为回文结构。如果链表长度为N,时间复杂度为O(N),空间复杂度为O(1)分析:方法1:使用栈,需要O(N)的额外空间1.将链表中节点的值全部存入栈中,2.根据栈先进后出的特性,和原链表元素从头进行比较方法2:使用栈和快慢指针,相较于方法1减少一半额外空间1.使用快慢指针找到链表的中点(代码中找的是链表中点的下一个位置)2.根据栈先进后出的特性,将链表后半部分存入栈中3.将链表的前半部分和后半部分进行比较方法3:使用快慢指针,并且将链表右半部分进行逆序,需要O(原创 2021-11-30 21:43:02 · 713 阅读 · 0 评论 -
算法面试题-排序元素移动小于k的数组
题目:已知一个几乎有序的数组(几乎有序是指如果把数组排好序的话,每个元素移动的距离不超过k,且k相较于数组而言较小).请选择一个合适的排序算法对这个数据进行排序分析:使用优先级队列解决这个问题,假设数组为[4,2,6,1,9,5],k=3: 1.首先确定每次保留堆的大小,k=3则需要保留堆的大小就为4(保留堆的大小要看整个数组的大小情况)。 因为当取前4个元素[4,2,6,1]时,数组最末端的元素移动到数组首位最多移动k=3位,符合条件 2.将堆中的堆顶元素弹出重新放入到数原创 2021-11-15 00:00:32 · 356 阅读 · 0 评论 -
算法面试题-有序数组查找数字
题目:(1)在有序数组中找某个数是否存在(2)在有序数组中,找满足>=某个数的最左位置分析:(1)如果直接从头到尾依次进行比较, 时间复杂度为O(N); 如果采用二分法, 时间复杂度为O(log2^N)(2)相较于第一题中找到满足条件的位置就停止, 该题目需要一直二分到结束代码实现:public static boolean exist(int[] sortedArr, int num) { /** * 题(1) */ if (sortedArr ==原创 2021-10-31 20:05:44 · 230 阅读 · 0 评论 -
算法面试题-奇数次的数
题目:(1)一组数中,只有一个数出现了奇数次,其余数都出现偶数次,在O(N)的时间复杂度中找出该数(2)一组数中,有两个数出现了奇数次,其余数都出现偶数次,在O(N)的时间复杂度中找出这两个数分析:(1)假设eor = 0,将eor分别与该数组中的全部数进行异或,最后得到的结果就是该数。比如数组为[2,1,3,1,2], eor = 0 ^ 2 ^ 1 ^ 3 ^ 1 ^ 2 = 1 ^ 1 ^ 2 ^ 2 ^ 3 = 0 ^ 0 ^ 3 = 3(2)假设eor = 0,将eor分别与该数组原创 2021-10-31 20:00:44 · 193 阅读 · 0 评论 -
算法面试题-局部最小值
题目:查询一个数组的任意一个局部最小值(如果第0个元素 < 第1个元素,0就是局部最小 , 第length - 1个元素 < 第length - 2元素,length - 1 就是局部最小),中间部分要满足局部最小值需要该位置上的值既小于左边元素值也小于右边元素值,。其中,数组无序且相邻两个数一定不相等。分析:先去判断左右两个边界是否为局部最小, 如果是则输出其下标0或者arr.length-1 如果两个边界全部不是局部最小值, 就采用二分法去查找中间部分的局部最小值:首先要明确原创 2021-10-31 19:48:35 · 506 阅读 · 0 评论