经典面试题目笔记二 1、在行也有序、列也有序的二维数组中,找num,找到返回true,否则false public static boolean isContains(int[][] matrix, int K) { int row = 0; int col = matrix[0].length - 1; while (row < matrix.length && col > -1) { if (matrix[row][col] == K) { return
算法与数据结构进阶课第十三节笔记 AC自动机与卡特兰数AC自动机1)关键在于fail指针的理解(网上帖子几乎没有解释)fail指针含义:目前来到的节点,之前路径上的字符串记为str,除了str之外哪个前缀字符串,和str的后缀串匹配最大,fail指针就指向那个最大匹配串的最后字符底下的节点。(难理解吧?其实是精髓,看视频)2)构建和使用看视频...
算法与数据结构进阶课第十二节笔记 有序表的原理、应用、扩展搜索二叉树搜索二叉树一定要说明以什么标准来排序经典的搜索二叉树,树上没有重复的用来排序的key值如果有重复节点的需求,可以在一个节点内部增加数据项...
算法与数据结构进阶课第十一节笔记 资源限制类题目1)布隆过滤器用于集合的建立与查询,并可以节省大量空间(已讲)2)一致性哈希解决数据服务器的负载管理问题(已讲)3)利用并查集结构做岛问题的并行计算(已讲)4)哈希函数可以把数据按照种类均匀分流5)位图解决某一范围上数字的出现情况,并可以节省大量空间6)利用分段统计思想、并进一步节省大量空间7)利用堆、外排序来做多个处理单元的结果合并题目1:32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然存在没出现
算法与数据结构进阶课第十节笔记 哈希函数有关的结构和岛问题认识哈希函数 -> out f(in data)1)输入参数data,假设是in类型,特征:可能性无穷大,比如str类型的参数2)输出参数类型out,特征:可能性可以很大,但一定是有穷尽的3)哈希函数没有任何随机的机制,固定的输入一定是固定的输出4)输入无穷多但输出值有限,所以不同输入也可能输出相同(哈希碰撞)5)再相似的不同输入,得到的输出值,会几乎均匀的分布在out域上重点:第5条!一个40亿的整数文件,一个整数是4个字节,只有1...
算法与数据结构进阶课第九节笔记 数组累积和问题三连例1、给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的,返回其长度。准备一个窗口[L..R] 的累积和是windowSumwindowSum > K, R++ 因为都是正数,已经大于 ,那么之后再累加不可能再小于等于KwindowSum < K, L ++windowSum = K, max = Math.max(R-L+1,max) public static i.
算法与数据结构进阶课第八节笔记 打表技巧和矩阵处理技巧打表法1)问题如果返回值不太多,可以用hardcode的方式列出,作为程序的一部分2)一个大问题解决时底层频繁使用规模不大的小问题的解,如果小问题的返回值满足条件1),可以把小问题的解列成一张表,作为程序的一部分3)打表找规律(本节课重点),有关1)和2)内容欢迎关注后序课程打表找规律1)某个面试题,输入参数类型简单,并且只有一个实际参数2)要求的返回值类型也简单,并且只有一个3)用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code.
算法与数据结构进阶课第七节笔记 线段树1,一种支持范围整体修改和范围整体查询的数据结构2,解决的问题范畴:大范围信息可以只由左、右两侧信息加工出,而不必遍历左右两个子范围的具体状况给定一个数组arr,用户希望你实现如下三个方法1)void add(int L, int R, int V) : 让数组arr[L…R]上每个数都加上V2)void update(int L, int R, int V) : 让数组arr[L…R]上每个数都变成V3)int sum(int L, int R) :让返回arr[L…R]这..
算法与数据结构进阶课第六节笔记 Morris遍历及其相关扩展一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1)通过利用原树中大量空闲指针的方式,达到节省空间的目的当前节点cur,一开始cur来到树头1、cur无左树,cur = cur.right2、cur 有左树,找到左树最右节点mostRight(1)、mostRight 的右指针指向null, mostRight.right = cur, cur = cur.left(2)、mostRight 的右指针指向 cur,mostRight..
算法与数据结构进阶课第五节笔记 Manacher算法及其扩展假设字符串str长度为N,想返回最长回文子串的长度,时间复杂度O(N)暴力解法,以每个字符为中心计算回文子串的长度,但是要给每个字符中间加一个特殊字符,例如31211214 ---- #3#1#2#1#1#2#1#4# 这样计算出来的每个结果除2就是实际的回文子串长度Manacher就是在这个暴力解法的基础上利用信息做加速1、回文半径(从中心开始数一半)、回文直径(整个回文串的长度)2、回文半径数组 pArr[] 记录每个位置得出的答案3、回文最右..
算法与数据结构进阶课第四节笔记 KMP算法及其扩展假设字符串str长度为N,字符串match长度为M,M <= N,想确定str中是否有某个子串是等于match的。时间复杂度O(N)指标,i 位置前的字符串的,前缀与后缀相同的最大长度,不能等于整体建立这样一个指标数组a a b a a b c -1 0 1 0 1 2 3 -1和0人为规定 public static int getIndexOf(Str...
算法与数据结构进阶课第三节笔记 bfprt算法与蓄水池算法蓄水池算法例1:假设有一个源源吐出不同球的机器,只有装下10个球的袋子,每一个吐出的球,要么放入袋子,要么永远扔掉,如何做到机器吐出每一个球之后,所有吐出的球都等概率被放进袋子里?第k个球到来的时候,以10/k的概率放入袋子,扔的时候10个里面随机选一个例2:给定一个能概率的返回0-7的函数,怎么做能等概率的返回某个范围首先将这个给定的函数,均分,奇数时最大的那个返回重roll,这样可以概率的返回0,1, 之后想要概率的返回(0,n)就看n用二进制k位能表示,等
算法与数据结构进阶课第二节笔记 类似斐波那契数的递归斐波那契数的快速幂f(n-1) * a + f(n-2) * c = f(n)f(n-1) * b + f(n-2) * d = f(n-1) 可以计算出a,b,c,d因为f(n) = f(n-1) + f(n-2) 必然会有上面的公式替换进去就能得出继续推导得出 public static int f3(int n) { if (n < 1) { return 0; } if (n == 1 ||...
算法与数据结构进阶课第一节笔记 单调栈和滑动窗口滑动窗口是什么?滑动窗口是一种想象出来的数据结构:滑动窗口有左边界L和有边界R在数组或者字符串或者一个序列上,记为S,窗口就是S[L..R]这一部分L往右滑意味着一个样本出了窗口,R往右滑意味着一个样本进了窗口L和R都只能往右滑初始L,R都是0,L<=R双端队列的作用,在此时的状态下,R不再动,L往右移,哪些数是最大值的优先级窗口不管L还是R滑动之后,都会让窗口呈现新状况,如何能够更快的得到窗口当前状况下的最大值和最小值?最好平均下来复杂度能
算法与数据结构基础课第十二节笔记 暴力递归转动态规划什么暴力递归可以继续优化?有重复调用同一个子问题的解,这种递归可以优化如果每一个子问题都是不同的解,无法优化也不用优化例1:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2开始时机器人在其中的M位置上(M 一定是 1~N 中的一个)如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到 N-1 位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走 K 步,最终能来到P位置(P也是1
算法与数据结构基础课第十一节笔记 暴力递归暴力递归就是尝试1,把问题转化为规模缩小了的同类问题的子问题2,有明确的不需要继续进行递归的条件(base case)3,有当得到了子问题的结果之后的决策过程4,不记录每一个子问题的解熟悉什么叫尝试?例1:打印n层汉诺塔从最左边移动到最右边的全部过程1、1 ~ n-1 左到中2、n 左到右3、1~n-1 中到右模拟手动移的过程: public static void hanoi1(int n) { leftToRight(n); }
算法与数据结构基础课第十节笔记 并查集结构和图相关算法并查集有若干个样本a、b、c、d…类型假设是V 在并查集中一开始认为每个样本都在单独的集合里 用户可以在任何时候调用如下两个方法: boolean isSameSet(V x, V y) : 查询样本x和样本y是否属于一个集合 void union(V x, V y) : 把x和y各自所在集合的所有样本合并成一个集合 isSameSet和union方法的代价越低越好 public static class Node<V> { V val
算法与数据结构基础课第九节笔记 贪心算法最自然智慧的算法 用一种局部最功利的标准,总是做出在当前看来是最好的选择 难点在于证明局部最功利的标准可以得到全局最优解 对于贪心算法的学习主要以增加阅历和经验为主例1:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中,字典序最小的结果贪心策略1:先给数组按照字典序排序,然后依次拼起来,适用于大多数case,但是个别如:ba,b 会拼成bba,但是bab实际上字典序更小,也就是两个字符串x,yx 的字典序 小于等于 y 的,那么x
算法与数据结构基础课第八节笔记 二叉树的递归套路例1:如何设计一个直观打印整棵二叉树的函数将原本的树逆时针转90度右中左的顺序public static void printTree(Node head) { System.out.println("Binary Tree:"); printInOrder(head, 0, "H", 17); System.out.println(); } public static void printInOrder(Node head, int height, St