算法
文章平均质量分 61
严太白
菊厂搬砖人
展开
-
算法数据结构(三十九)----动态规划猜法中外部信息简化
题目一https://leetcode.com/problems/burst-balloons/打爆气球的最大得分尝试:int f(L,R) 设计的f()函数必须满足,在arr L....R 上打爆气球最大得分,必须满足L-1,R+1没爆的情况下,才能调用这个函数去计算打爆L....R上的所有气球的最大得分public static int maxCoins0(int[] arr) { // [3,2,1,3] // [1,3,2,1,3,1] int N = arr..原创 2021-09-13 23:26:35 · 380 阅读 · 0 评论 -
算法数据结构(三十八)----DC3算法
后缀和数组后缀数组其实代表所有的后缀字符串在排完名之后,从第0名到第7名依次写下来,这就是所谓的后缀数组 不会有相同的排名,因为长度不一样生成后缀数组1)暴力求解: 先生成所有的后缀字符串,复杂度O(N^2) 后缀字符串数量O(N),N个后缀字符串排序,代价O(N*logN)2)DC3求解:O(N) 根据下标模3来分组,做了一个类似于递归的事情把这个问题快速解决,有一个前提,初始时,数组里头每个...原创 2021-09-13 22:46:44 · 1571 阅读 · 2 评论 -
算法数据结构(三十七)----状态压缩技巧
题目一链接:https://leetcode-cn.com/problems/can-i-win在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。给定一个整数maxChoosableInteger(整数池中可选择的最大数..原创 2021-09-08 21:28:26 · 202 阅读 · 0 评论 -
算法数据结构(三十六)----四边形不等式技巧
题目一给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分每一种方案都有,min{左部分累加和,右部分累加和}求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少?整个过程要求时间复杂度O(N)//暴力求解public static int bestSplit1(int[] arr) { if (arr == null || arr.length < 2) { return 0; } int N = arr.le原创 2021-09-07 23:19:18 · 390 阅读 · 0 评论 -
算法数据结构(三十五)----子数组达到累加和的最大长度系列
题目一给定一个正整数组成的无序数组arr,给定一个正整数值K找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的返回其长度//滑动窗口public static int getMaxLength(int[] arr, int K) { if (arr == null || arr.length == 0 || K <= 0) { return 0; } int left = 0; int right = 0; int sum = arr原创 2021-09-06 23:05:09 · 592 阅读 · 1 评论 -
算法数据结构(三十四)----根据对数器找规律&根据数据量猜解法&分治
对数器找规律1)某个面试题,输入参数类型简单,并且只有一个实际参数2)要求的返回值类型也简单,并且只有一个3)用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code题目一小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1)能装下6个苹果的袋子2)能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。给定一个正整数N,返回至少使用多少袋子。如果N无法让使用的每个袋原创 2021-08-31 21:10:42 · 326 阅读 · 0 评论 -
算法数据结构(三十三)----有序表
搜索二叉树搜索二叉树一定要说明以什么标准来排序经典的搜索二叉树,树上没有重复的用来排序的key值如果有重复节点的需求,可以在一个节点内部增加数据项搜索二叉树查询key(查询某个key存在还是不存在)1)如果当前节点的value==key,返回true2)如果当前节点的value<key,当前节点向左移动3)如果当前节点的value>key,当前节点向右移动4)如果当前节点变成null,返回false搜索二叉树插入新的key和查询过程一样,但当..原创 2021-08-30 22:02:50 · 582 阅读 · 0 评论 -
算法数据结构(三十二)----资源限制技巧汇总
资源限制技巧1)布隆过滤器用于集合的建立与查询,并可以节省大量空间(已讲)2)一致性哈希解决数据服务器的负载管理问题(已讲)3)利用并查集结构做岛问题的并行计算(已讲)4)哈希函数可以把数据按照种类均匀分流5)位图解决某一范围上数字的出现情况,并可以节省大量空间6)利用分段统计思想、并进一步节省大量空间7)利用堆、外排序来做多个处理单元的结果合并题目一32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,可以使.原创 2021-08-26 21:39:49 · 200 阅读 · 0 评论 -
算法数据结构(三十一)----与hash函数有关的结构
hash函数1)输入参数data,假设是in类型,特征:可能性无穷大,比如str类型的参数2)输出参数类型out,特征:可能性可以很大,但一定是有穷尽的3)哈希函数没有任何随机的机制,固定的输入一定是固定的输出4)输入无穷多但输出值有限,所以不同输入也可能输出相同(哈希碰撞)5)再相似的不同输入,得到的输出值,会几乎均匀的分布在out域上重点:第5条!增删改查复杂度都是O(1)private MessageDigest hash; public Hash(St.原创 2021-08-25 21:02:17 · 248 阅读 · 0 评论 -
算法数据结构(三十)----indexTree&AC自动机
indexTree特点:1)支持区间查询2)没有线段树那么强,但是非常容易改成一维、二维、三维的结构3)只支持单点更新前缀和数组:可以非常快速的得到L.....R上的累加和,但是如果源数组中的某个元素变更时,前缀和数组将存在大量更新的问题。1)改变某一个节点的值,比如i位置的值变成V2)想非常快速的查询 L....R范围上的累加和线段树可以实现,但是使用indexTree有比线段树更优的地方indexTree不适于解决从L....R统一变成一个值的问题,将会非常原创 2021-08-24 22:28:17 · 338 阅读 · 0 评论 -
算法数据结构(二十九)----线段树(一)
线段树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...原创 2021-08-23 22:01:24 · 170 阅读 · 0 评论 -
算法数据结构(二十八)----二叉树的Morris遍历
Morris遍历一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1)通过利用原树中大量空闲指针的方式,达到节省空间的目的Morris遍历细节假设来到当前节点cur,开始时cur来到头节点位置1)如果cur没有左孩子,cur向右移动(cur = cur.right)2)如果cur有左孩子,找到左子树上最右的节点mostRight: a.如果mostRight的右指针指向空,让其指向cur, 然后cur向左移动(cur = cur.left) b...原创 2021-08-21 21:11:55 · 117 阅读 · 0 评论 -
算法数据结构(二十七)----bfprt算法&蓄水池算法
题目一在无序数组中求第K小的数1)改写快排的方法2)bfprt算法//使用大根堆,求解public static class MaxHeapComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } } // 利用大根堆,时间复杂度O(N*logK) public sta原创 2021-08-20 23:22:48 · 204 阅读 · 0 评论 -
算法数据结构(二十六)----Manacher算法
Manacher算法解决问题:快速求出字符串的最长回文子串的长度时间复杂度O(N)Manacher算法核心1)理解回文半径数组2)理解所有中心的回文最右边界R,和取得R时的中心点C3)理解 L…(i`)…C…(i)…R 的结构,以及根据i’回文长度进行的状况划分4)每一种情况划分,都可以加速求解i回文半径的过程public static int manacher(String s) { if (s == null || s.length() == 0) ...原创 2021-08-19 21:22:43 · 147 阅读 · 0 评论 -
算法数据结构(二十五)----KMP算法
应用:消息中间件门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生原创 2021-08-18 21:32:55 · 126 阅读 · 0 评论 -
算法数据结构(二十四)----斐波那契数列到矩阵快速幂技巧
类似斐波那契数列的递归优化如果某个递归,除了初始项之外,具有如下的形式F(N) = C1 * F(N) + C2 * F(N-1) + … + Ck * F(N-k) ( C1…Ck 和k都是常数)并且这个递归的表达式是严格的、不随条件转移的那么都存在类似斐波那契数列的优化,时间复杂度都能优化成O(logN)题目一斐波那契数列矩阵乘法方式的实现//递归实现public static int f1(int n) { if (n < 1) { return .原创 2021-08-17 22:55:51 · 233 阅读 · 0 评论 -
算法数据结构(二十三)----单调栈(一)
单调栈是什么?一种特别设计的栈结构,为了解决如下的问题:给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息1)arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪?2)arr[i]的右侧离i最近并且小于(或者大于)arr[i]的数在哪?如果想得到arr中所有位置的两个信息,怎么能让得到信息的过程尽量快。那么到底怎么设计呢?题目一单调栈实现没重复值的单调栈实现:1)栈中元素存数组下标2)栈按元素值从小到大排序3)当新来的一个.原创 2021-08-16 22:25:28 · 304 阅读 · 0 评论 -
算法数据结构(二十二)----滑动窗口
滑动窗口是什么?滑动窗口是一种想象出来的数据结构:滑动窗口有左边界L和有边界R在数组或者字符串或者一个序列上,记为S,窗口就是S[L..R]这一部分L往右滑意味着一个样本出了窗口,R往右滑意味着一个样本进了窗口L和R都只能往右滑滑动内最大值和最小值的更新结构窗口不管L还是R滑动之后,都会让窗口呈现新状况,如何能够更快的得到窗口当前状况下的最大值和最小值?最好平均下来复杂度能做到O(1)利用单调双端队列!题目一假设一个固定大小为W的窗口,依次划过ar.原创 2021-08-15 22:42:12 · 987 阅读 · 1 评论 -
算法数据结构(二十一)----暴力递归改动态规划(六)
题目一给定一个正数数组arr,请把arr中所有的数分成两个集合,尽量让两个集合的累加和接近返回:最接近的情况下,较小集合的累加和//暴力递归public static int right(int[] arr) { if (arr == null || arr.length < 2) { return 0; } int sum = 0; for (int num : arr) { sum += num; } return process(a原创 2021-08-12 23:23:09 · 182 阅读 · 0 评论 -
算法数据结构(二十)----暴力递归改动态规划(五)
题目一给定3个参数,N,M,K怪兽有N滴血,等着英雄来砍自己英雄每一次打击,都会让怪兽流失[0~M]的血量到底流失多少?每一次在[0~M]上等概率的获得一个值求K次打击之后,英雄把怪兽砍死的概率//暴力递归public static double right(int N, int M, int K) { if (N < 1 || M < 1 || K < 1) { return 0; } long all = (long) Math.pow原创 2021-08-11 23:04:30 · 246 阅读 · 0 评论 -
算法数据结构(十九)----暴力递归改动态规划(四)
题目一给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和返回最小距离累加和//方法一 public static int minPathSum1(int[][] m) { if (m == null || m.length == 0 || m[0] == null || m[0].length == 0) { return 0; } int row = m.length; int col原创 2021-08-10 23:07:05 · 285 阅读 · 3 评论 -
算法数据结构(十八)----暴力递归改动态规划(三)
题目一https://leetcode.com/problems/longest-palindromic-subsequence/给定一个字符串str,返回这个字符串的最长回文子序列长度比如 : str = “a12b3c43def2ghi1kpm”最长回文子序列是“1234321”或者“123c321”,返回长度7暴力递归public static int lpsl1(String s) { if (s == null || s.length() == 0) { ..原创 2021-08-09 22:20:14 · 240 阅读 · 1 评论 -
算法数据结构(十七)----暴力递归改动态规划(二)
题目一 :背包问题给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值。给定一个正数bag,表示一个载重bag的袋子,你装的物品不能超过这个重量。返回你能装下最多的价值是多少? 从左往右尝试模型暴力递归// 所有的货,重量和价值,都在w和v数组里 // 为了方便,其中没有负数 // bag背包容量,不能超过这个载重 // 返回:不超重的情况下,能够得到的最大价值 public static原创 2021-08-07 21:45:49 · 351 阅读 · 0 评论 -
算法数据结构(十六)----暴力递归改动态规划(一)
怎么尝试一件事?1)有经验但是没有方法论?2)怎么判断一个尝试就是最优尝试?3)难道尝试这件事真的只能拼天赋?那我咋搞定我的面试?4)动态规划是啥?好高端的样子哦…可是我不会啊!和尝试有什么关系?最强的私货来了!-> 暴力递归到动态规划的套路!解决任何面试中的动态规划问题!什么暴力递归可以继续优化?有重复调用同一个子问题的解,这种递归可以优化如果每一个子问题都是不同的解,无法优化也不用优化暴力递归和动态规划的关系某一个暴力递归,有解的重复调用,就可..原创 2021-08-06 22:30:59 · 209 阅读 · 0 评论 -
算法数据结构(十五)----暴力递归
暴力递归就是尝试 1,把问题转化为规模缩小了的同类问题的子问题2,有明确的不需要继续进行递归的条件(base case)3,有当得到了子问题的结果之后的决策过程4,不记录每一个子问题的解熟悉什么叫尝试?打印n层汉诺塔从最左边移动到最右边的全部过程简单版本,规定6个函数,相互调用public static void hanoi1(int n) { leftToRight(n); } // 请把1~N层圆盘 从左 -> 右 public static.原创 2021-08-05 22:42:37 · 218 阅读 · 0 评论 -
算法数据结构(十四)----图
概念1)由点的集合和边的集合构成2)虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达,无向图可以看成是有双向边的有向图3)边上可能带有权值图结构的表达1)邻接表法2)邻接矩阵法3)除此之外还有其他众多的方式图的题目该如何解题图的算法都不算难,只不过coding的代价比较高1)先用自己最熟练的方式,实现图结构的表达2)在自己熟悉的结构上,实现所有常用的图算法作为模板3)把面试题提供的图结构转化为自己熟悉的图结构,再调用模板或改写即可..原创 2021-08-04 22:44:24 · 159 阅读 · 0 评论 -
算法数据结构(十三)----并查集
1)有若干个样本a、b、c、d…类型假设是V2)在并查集中一开始认为每个样本都在单独的集合里3)用户可以在任何时候调用如下两个方法: boolean isSameSet(V x, V y) : 查询样本x和样本y是否属于一个集合 void union(V x, V y) : 把x和y各自所在集合的所有样本合并成一个集合4) isSameSet和union方法的代价越低越好1)每个节点都有一条往上指的指针2)节点a往上找到的头节点,叫做a所在集合的代...原创 2021-08-02 21:56:16 · 169 阅读 · 0 评论 -
算法数据结构(十二)----贪心算法
贪心算法1)最自然智慧的算法2)用一种局部最功利的标准,总是做出在当前看来是最好的选择3)难点在于证明局部最功利的标准可以得到全局最优解4)对于贪心算法的学习主要以增加阅历和经验为主贪心算法求解的标准过程1,分析业务2,根据业务逻辑找到不同的贪心策略3,对于能举出反例的策略直接跳过,不能举出反例的策略要证明有效性这往往是特别困难的,要求数学能力很高且不具有统一的技巧性贪心算法的解题套路1,实现一个不依靠贪心策略的解法X,可以用最暴力的尝试2,..原创 2021-08-01 22:56:54 · 208 阅读 · 1 评论 -
算法数据结构(十一)----终极套路(二叉树递归套路)
二叉树的递归套路可以解决面试中绝大多数的二叉树问题尤其是树型dp问题本质是利用递归遍历二叉树的便利性1)假设以X节点为头,假设可以向X左树和X右树要任何信息2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要)3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息4)把左树信息和右树信息求全集,就是任何一棵子树都需要返回的信息S5)递归函数都返回S,每一棵子树都这么要求6)写代码,在代码中考虑如何把左树的信息和右树信息整合出整棵树的信息套路练原创 2021-07-31 23:44:19 · 294 阅读 · 1 评论 -
算法数据结构(十)----二叉树
二叉树的先序、中序、后序遍历先序:任何子树的处理顺序都是,先头节点、再左子树、然后右子树中序:任何子树的处理顺序都是,先左子树、再头节点、然后右子树后序:任何子树的处理顺序都是,先左子树、再右子树、然后头节点递归实现public static class Node { public int value; public Node left; public Node right; public Node(int v) { value = v; } }.原创 2021-07-30 00:16:57 · 159 阅读 · 1 评论 -
算法数据结构(九)----链表
面试时链表解题方法论1)对于笔试,不用太在乎空间复杂度,一切为了时间复杂度2)对于面试,时间复杂度依然放在第一位,但是一定要找到空间最省的方法链表面试题常用数据结构和技巧1)使用容器(哈希表、数组等)2)快慢指针 快慢指针求解1)输入链表头节点,奇数长度返回中点,偶数长度返回上中点2)输入链表头节点,奇数长度返回中点,偶数长度返回下中点3)输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个4)输入链表头节点,奇数长度返回中点前一个,偶数长度..原创 2021-07-28 22:04:13 · 113 阅读 · 0 评论 -
算法数据结构(八)---排序算法总结
时间复杂度 额外空间复杂度 稳定性选择排序 O(N^2) O(1) 无冒泡排序 O(N^2) ...原创 2021-07-28 21:55:41 · 130 阅读 · 0 评论 -
算法数据结构(七)---前缀树&基数排序
前缀树1)单个字符串中,字符从前到后的加到一棵多叉树上2)字符放在路上,节点上有专属的数据项(常见的是pass和end值)3)所有样本都这样添加,如果没有路就新建,如有路就复用4)沿途节点的pass值增加1,每个字符串结束时来到的节点end值增加1可以完成前缀相关的查询设计一种结构。用户可以:1)void insert(String str) 添加某个字符串,可以重复添加,每次算1个2)int search(String str)...原创 2021-07-27 23:55:54 · 196 阅读 · 0 评论 -
算法数据结构(六)---堆与堆排序
比较器1)比较器的实质就是重载比较运算符 2)比较器可以很好的应用在特殊标准的排序上 3)比较器可以很好的应用在根据特殊标准排序的结构上4)写代码变得异常容易,还用于范型编程 public static class Student { public String name; public int id; public int age; public Student(String name, int id, int age) { this.name = .原创 2021-07-27 22:26:46 · 199 阅读 · 0 评论 -
算法数据结构(五)---快速排序
Partition过程给定一个数组arr,和一个整数num。请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N) public static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } // arr[L..R]上,以arr[R]位置的数做划分值 // <= X >原创 2021-07-24 21:37:45 · 169 阅读 · 0 评论 -
算法数据结构(四)---归并排序
归并排序复杂度根据master可知时间复杂度为O(N*logN)merge过程需要辅助数组,所以额外空间复杂度为O(N)归并排序的实质是把比较行为变成了有序信息并传递,比O(N^2)的排序快归并排序实现递归实现左半边有序+右半有序+合并// 递归方法实现 public static void mergeSort1(int[] arr) { if (arr == null || arr.length < 2) { return; } process(原创 2021-07-24 14:09:09 · 234 阅读 · 0 评论 -
算法数据结构(三)---常见数据结构
单向链表//单向链表节点结构(可以实现成范型)public class Node { public int value; public Node next; public Node(int data) { value = data; }}双向链表//双向链表节点结构public class DoubleNode { public int value; public DoubleNode last; publi原创 2021-07-23 20:56:40 · 259 阅读 · 0 评论 -
算法数据结构(二)---认识异或运算
什么是异或?异或运算:相同为0,不同为1同或运算:相同以1,不同为0能长时间记住的概率接近0%所以,异或运算就记成无进位相加!异或运算的性质1)0^N == N N^N == 02)异或运算满足交换律和结合率 上面的两个性质用无进位相加来理解就非常的容易如何不用额外变量交换两个数 ?public static void swap (int[] arr, int i, int j) { // i和j一个位置会出错 ...原创 2021-07-22 23:12:54 · 685 阅读 · 5 评论 -
算法数据结构(一)---认识复杂度、对数器、二分法
评估算法优劣的核心指标是什么?1) 时间复杂度(流程决定)2) 额外空间复杂度(流程决定)3)常数项时间(实现细节决定)时间复杂度怎么估算?1)将算法每个步骤都划分为常数项时间操作2)确定算法流程的总操作数量与样本数量之间的表达式关系,只看表达式最高阶项的部分何为常数时间的操作?如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间。称这样的操作为常数时间的操作。常见的常数时间的操作有哪些?1)常见的算术运算(+、-、*、/、% 等)2原创 2021-07-20 22:26:08 · 449 阅读 · 1 评论