算法笔记
文章平均质量分 58
木水先生
严于律己,宽以待人。
展开
-
位运算基础
1 位运算概述与,有0则00 & 0=00 & 1=01 & 0=01 & 1=1或,有1则10 ∣ 0=00 ∣ 1=11 ∣ 0=11 ∣ 1=1异或,同0异10⊕0=00⊕1=11⊕0=11⊕1=0取反∼0=1∼1=02 移位运算移位运算按照移位方向分类可以分成左移和右移,按照是否带符号分类可以分成算术移位和逻辑移位。左移运算的符号是 <<。左移运算时,将全部二进制位向左移动若干位,高位丢弃,低位补 00。左原创 2021-09-28 11:43:12 · 717 阅读 · 0 评论 -
tok-K问题详解
1 前言转自作者huan-yong原文链接 top-K问题详解腾讯面试被面试官“羞辱”之后,脸红如饮酒,抓紧时间学一波。2 思路解析什么是top-k问题top-K 问题是一类经典的问题,它能解决许多海量数据处理相关的问题,例如在1亿个数据中找出访问次数前1000的热点数据,在海量搜索字符串中找出搜索频率排在前十的搜索字符串等等。思路有哪些我们可以将这类问题分为三个方向考虑:1.将输入内容(假设用数组存放)进行 完全排序 ,从中选出排在前K的元素即为所求。有了这个思路,我们可以选择相转载 2021-04-01 13:53:47 · 1778 阅读 · 0 评论 -
数组中相加和为0的三元组
1 题目链接数组中相加和为0的三元组2 题目要求描述给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)解集中不能包含重复的三元组。例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20)3 代码思路A[i] + A[j] + A[k] = 0,固定A[i],使用双指针左右同时探测 A[原创 2021-03-31 15:58:34 · 147 阅读 · 0 评论 -
判断回文串
1 题目链接判断回文串2 题目描述描述判断题目给出的字符串是不是回文,仅考虑字符串中的字母字符和数字字符,并且忽略大小写例如:"nowcoder Is Best tesbsi: redoc won"是回文"race a car"不是回文注意:你有没有考虑过字符串可能为空?这是面试时应该提出的一个好问题。针对这个问题,我们定义空字符串是回文示例示例1输入:"nowcoder Is Best tesbsi: redoc won"返回值:true示例2输入:"race a c原创 2021-03-30 10:35:54 · 208 阅读 · 0 评论 -
出现一次的数字
1 题目链接出现一次的数字2 题目描述描述现在有一个整数类型的数组,数组中素只有一个元素只出现一次,其余的元素都出现两次。你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?3 代码思路考察异或运算符的特点:(1) 异或满足交换律。A^B = B^A(2) 两个相同的数异或为0。(3) 0异或一个数为这个数本身。4 代码实现public class Solution { public int singleNumber (int[] A) {原创 2021-03-30 09:45:09 · 66 阅读 · 0 评论 -
拷贝有随机指针的链表
1 题目链接拷贝有随机指针的链表2 题目描述描述现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。请对这个链表进行深拷贝。涉及到的链表结构// 普通链表class RandomListNode{ int val; ListNode next; ListNode random; public RandomListNode(x){ this.val = x; }}3 代码思原创 2021-03-30 09:34:34 · 201 阅读 · 0 评论 -
判断链表中是否有环
1 题目链接判断链表中是否有环2 题目描述描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。你能给出空间复杂度[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EHfyn9Z-1616998608018)(https://www.nowcoder.com/equation?tex=O(1)])的解法么?3 代码思路快慢指针的经典用法。快指针每次走两步,慢指针每次走一步,相遇即有环。无环,快指针最终指向null结点。4 代码实现pub原创 2021-03-29 14:17:13 · 72 阅读 · 0 评论 -
链表中环的入口结点
1 题目链接链表中环的入口结点2 题目要求对于一个给定的链表,返回环的入口节点,如果没有环,返回null拓展:你能给出不利用额外空间的解法么?3 代码思路人傻了,不利用额外空间意思是O(1)也不能用?这个是我钻牛角尖呢,还是题目描述不清楚呢?暂时理解为空间复杂度要求O(1)吧。图中的思路理一下,清楚之后我们考虑,代码怎么写呢?倒走n,在单向链表上是不合理的,因此要转换为正向走过多少距离。通过慢指针我们能够清楚的看到,如果慢指针只走了m,那么不正是入口结点吗。因此我们只需要让慢指针从起点重新原创 2021-03-29 13:57:44 · 109 阅读 · 0 评论 -
重排链表
1 题目链接重排链表2 题目要求描述将给定的单链表 L: L0→L1→…→Ln-1→Ln重新排序为:L0→Ln →L1→Ln-1→L2→Ln-2→…要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。例如:对于给定的单链表{10,20,30,40},将其重新排序为{10,40,20,30}。3 代码思路单链表查找只能顺着链表方向,读完题目之后,我们发现偶数结点的n、n-1这部分是逆序的,为了挨个遍历这部分并插入,我们需要找到这些结点,并将其翻转。从哪里开始翻转呢,奇原创 2021-03-29 13:11:09 · 1059 阅读 · 0 评论 -
二叉树的前序遍历-迭代法实现
1 题目链接二叉树的前序遍历2 题目要求描述求给定的二叉树的前序遍历。例如:给定的二叉树为{1,#,2,3},返回:[1,2,3].备注;用递归来解这道题很简单,你可以给出迭代的解法么?示例输入:{1,#,2,3}返回值:[1,2,3]3 代码思路树的前序遍历等同于深度遍历,深度遍历使用迭代来实现考虑使用栈结构。访问每一个树的节点,如果右子树不为空,加入到栈中,左子树不为空,加入到栈中。注意栈的特点是后进先出,我们希望左子树的遍历在前,右子树的遍历在后,因此加入栈的顺序原创 2021-03-29 10:28:24 · 282 阅读 · 0 评论 -
链表的插入排序
1 题目链接链表的插入排序2 题目描述描述使用插入排序对链表进行排序。示例输入:{30,20,40}返回值:{20,30,40}3 代码思路牛客网关于链表的题目,传入的参数都是不带表头结点。因此我们为了第一个结点和后边结点插入方法相同,创建一个新的带表头结点的链表。每次取原链表中的一个值,然后在新链表中找到该值的插入位置。此时应注意,我们采用后插法,需要找到小于当前值的最后一个。找到之后,将当前值插入到新链表,直到原链表为空。4 代码实现public class Solut原创 2021-03-29 10:09:13 · 171 阅读 · 0 评论 -
后缀表达式求值
1 题目链接后缀表达式求值2 题目要求描述计算逆波兰式(后缀表达式)的值运算符仅包含"+","-","*“和”/",被操作数可能是整数或其他表达式["20", "10", "+", "30", "*"] -> ((20 + 10) * 30) -> 900["40", "130", "50", "/", "+"] -> (40 + (130 / 50)) -> 42示例输入:["20","10","+","30","*"]返回值:9003 代码思路原创 2021-03-28 21:31:10 · 724 阅读 · 0 评论 -
寻找第K大
1 题目链接寻找第K大2 题目要求描述有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。示例输入:[1,3,5,2,2],5,3返回值:23 代码思路题目要求寻找第K大的数,且要使用快排的思路。首先,拿到题目,要注意一个坑,怎么理解第K大?假设给我们一个数组{1,2,3,4,5},第一大的数是谁,很好判别,是5对吧,第二大的数呢,很容易犯迷糊是吧,答案是4,而不是2,原创 2021-03-23 22:00:38 · 64 阅读 · 0 评论 -
二叉树的最小深度
1 题目链接二叉树的最小深度2 题目要求描述求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。示例输入:{1,2,3,4,5}返回值:23 代码思路法一:使用递归完成。分为三种情况:空树、左子树或右子树为空、左右子树都不为空。如果当前树是空树,则返回高度0即可。如果左子树或右子树为空。左子树为空时,如我们要计算{F,#,I}的最小高度,我们只需要计算右子树{I}的最小高度加上当前节点{F}的高度即可。右子树为空时,如我们要计算{C,F,#,#原创 2021-03-23 20:52:18 · 2560 阅读 · 0 评论 -
输出二叉树的右视图
1 题目链接输出二叉树的右视图2 题目要求描述请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图。示例输入:[1,2,4,5,3],[4,2,5,1,3]返回值:[1,3,5]备注二叉树每个节点的值在区间[1,10000]内,且保证每个节点的值互不相同。3 代码思路首先如何理解右视图。右视图即二叉树从上到下,每一层最右边的节点组成的集合。想要输出二叉树的右视图,首先应该根据前序和中序序列创建出二叉树。我们知道前序遍历二叉树顺序是:根节点、遍历左子树、原创 2021-03-23 13:40:41 · 1026 阅读 · 1 评论 -
容器盛水问题
一 题目链接容器盛水问题二 题目要求描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。示例输入:[3,1,2,5,2,4]返回值:5输入:[4,5,1,3,2]返回值:2备注1≤N≤106三 代码思路题目的难点在于如何理解题目的意思。一张图读懂题目的意思。将数组看成一个凹凸不平的盆子,只有中间的槽可以用来放水。不难理解,我们只需要找到桶的边界,然后利用较短的边减去盆底高度,将所得的结果加起来即可。利用双指针同时原创 2021-03-23 09:31:42 · 268 阅读 · 0 评论 -
平衡二叉树
1 题目链接平衡二叉树2 题目要求描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。示例输入:{1,2,3,4,5,6,7}返回值:true3 代码思路根据平衡二叉树的性质,我们知道判断一棵二叉树是平衡二叉树,必须满足三个条件 :左右子树高度差不超过1、左子原创 2021-03-22 17:25:40 · 431 阅读 · 0 评论 -
设计LRU缓存结构
1 题目链接设计LRU缓存结构2 题目要求描述设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值要求set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示s原创 2021-03-21 17:20:08 · 286 阅读 · 0 评论 -
链表中的节点K个一组翻转
链表中的节点K个一组翻转1. 题目链接https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e2. 题目要求题目描述将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。要求空间复杂度 O(1)例如:给定的链表是 1→2→3→4→5对于 k=2, 你应该返回 2→1→4→3→5对于 k=3, 你应该返回原创 2021-03-08 14:07:22 · 164 阅读 · 0 评论