- 博客(62)
- 收藏
- 关注
原创 高频算法和数据结构(五)
题目一已知一棵搜索二叉树上没有重复值的节点,现在有一个数组arr,是这棵搜索二叉树先序遍历的结果请根据arr生成整棵树并返回头节点https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/解题:方法一:递归思想,定义函数f(L,R),从L....R范围是一棵树的先序遍历结果,请建出整颗树把头部node返回方法二: 使用单调栈,生成nearBig数组,跟原来数组等
2021-09-22 20:45:24 299 1
原创 高频算法和数据结构(四)
题目一数组为{3, 2, 2, 3, 1},查询为(0, 3, 2)意思是在数组里下标0~3这个范围上,有几个2?答案返回2。假设给你一个数组arr,对这个数组的查询非常频繁,都给出来请返回所有查询的结果解题:预处理结构,生成如下一张表,这样要查1~4中有几个1,在这个表中用二分查就可以public static class QueryBox2 { private HashMap<Integer, ArrayList<Integer>&g.
2021-09-22 19:58:47 450
原创 高频算法和数据结构(三)
题目一https://leetcode.com/problems/longest-substring-without-repeating-characters/求一个字符串中,最长无重复字符子串长度解题:求子串和子数组的问题:先求以0结尾的答案,然后求1结尾的答案1)当前字符串上一次出现的位置2)i-1位置往左推的距离两个条件,哪个长要哪个public static int lengthOfLongestSubstring(String s) { if (s .
2021-09-16 21:24:47 314
原创 高频算法和数据结构(二)
题目一给定数组hard和money,长度都为Nhard[i]表示i号的难度, money[i]表示i号工作的收入给定数组ability,长度都为M,ability[j]表示j号人的能力每一号工作,都可以提供无数的岗位,难度和收入都一样但是人的能力必须>=这份工作的难度,才能上班返回一个长度为M的数组ans,ans[j]表示j号人能获得的最好收入解题:先按难度进行分组,同一个组只留下报酬最高的;再把每个组的组长进行排序,难度大的报酬反而小的去掉publ.
2021-09-15 21:42:37 310
原创 高频算法和数据结构(一)
题目一给定一个有序数组arr,代表坐落在X轴上的点给定一个正数K,代表绳子的长度返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住解题:方法一:贪心,单绳子的末尾来到某个点时,二分求解前面有哪些点是大于绳子开头的方法二:滑动窗口public static int maxPoint1(int[] arr, int L) { int res = 1; for (int i = 0; i < arr.length; i++) { int neares
2021-09-14 23:08:25 285
原创 算法数据结构(三十九)----动态规划猜法中外部信息简化
题目一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 389
原创 算法数据结构(三十八)----DC3算法
后缀和数组后缀数组其实代表所有的后缀字符串在排完名之后,从第0名到第7名依次写下来,这就是所谓的后缀数组 不会有相同的排名,因为长度不一样生成后缀数组1)暴力求解: 先生成所有的后缀字符串,复杂度O(N^2) 后缀字符串数量O(N),N个后缀字符串排序,代价O(N*logN)2)DC3求解:O(N) 根据下标模3来分组,做了一个类似于递归的事情把这个问题快速解决,有一个前提,初始时,数组里头每个...
2021-09-13 22:46:44 1587 2
原创 算法数据结构(三十七)----状态压缩技巧
题目一链接:https://leetcode-cn.com/problems/can-i-win在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。给定一个整数maxChoosableInteger(整数池中可选择的最大数..
2021-09-08 21:28:26 208
原创 算法数据结构(三十六)----四边形不等式技巧
题目一给定一个非负数组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 397
原创 算法数据结构(三十五)----子数组达到累加和的最大长度系列
题目一给定一个正整数组成的无序数组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 597 1
原创 算法数据结构(三十四)----根据对数器找规律&根据数据量猜解法&分治
对数器找规律1)某个面试题,输入参数类型简单,并且只有一个实际参数2)要求的返回值类型也简单,并且只有一个3)用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code题目一小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1)能装下6个苹果的袋子2)能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。给定一个正整数N,返回至少使用多少袋子。如果N无法让使用的每个袋
2021-08-31 21:10:42 335
原创 算法数据结构(三十三)----有序表
搜索二叉树搜索二叉树一定要说明以什么标准来排序经典的搜索二叉树,树上没有重复的用来排序的key值如果有重复节点的需求,可以在一个节点内部增加数据项搜索二叉树查询key(查询某个key存在还是不存在)1)如果当前节点的value==key,返回true2)如果当前节点的value<key,当前节点向左移动3)如果当前节点的value>key,当前节点向右移动4)如果当前节点变成null,返回false搜索二叉树插入新的key和查询过程一样,但当..
2021-08-30 22:02:50 599
原创 算法数据结构(三十二)----资源限制技巧汇总
资源限制技巧1)布隆过滤器用于集合的建立与查询,并可以节省大量空间(已讲)2)一致性哈希解决数据服务器的负载管理问题(已讲)3)利用并查集结构做岛问题的并行计算(已讲)4)哈希函数可以把数据按照种类均匀分流5)位图解决某一范围上数字的出现情况,并可以节省大量空间6)利用分段统计思想、并进一步节省大量空间7)利用堆、外排序来做多个处理单元的结果合并题目一32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,可以使.
2021-08-26 21:39:49 202
原创 算法数据结构(三十一)----与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 256
原创 算法数据结构(三十)----indexTree&AC自动机
indexTree特点:1)支持区间查询2)没有线段树那么强,但是非常容易改成一维、二维、三维的结构3)只支持单点更新前缀和数组:可以非常快速的得到L.....R上的累加和,但是如果源数组中的某个元素变更时,前缀和数组将存在大量更新的问题。1)改变某一个节点的值,比如i位置的值变成V2)想非常快速的查询 L....R范围上的累加和线段树可以实现,但是使用indexTree有比线段树更优的地方indexTree不适于解决从L....R统一变成一个值的问题,将会非常
2021-08-24 22:28:17 350
原创 多线程与高并发(一)-----基础知识
线程的历史-----是一部对于cpu性能压榨的历史单进程人工切换– 纸带机多进程批处理– 多个任务批量执行多进程并行处理– 把程序写在不同的内存位置上来回切换多线程– 一个程序内部不同任务的来回切换– selector - epoll纤程/协程– 绿色线程,用户管理的(而不是OS管理的)线程什么是进程?什么是线程?什么是进程:资源分配的基本单位(静态概念)什么是线程:资源...
2021-08-23 23:57:03 722 4
原创 算法数据结构(二十九)----线段树(一)
线段树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 176
原创 算法数据结构(二十八)----二叉树的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 122
原创 算法数据结构(二十七)----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 215
原创 算法数据结构(二十六)----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 154
原创 算法数据结构(二十五)----KMP算法
应用:消息中间件门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生
2021-08-18 21:32:55 129
原创 算法数据结构(二十四)----斐波那契数列到矩阵快速幂技巧
类似斐波那契数列的递归优化如果某个递归,除了初始项之外,具有如下的形式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 242
原创 设计模式---总结
设计模式分类指导思想可维护性:修改功能,需要改动的地方越少,可维护性就越好可复用性:代码可以被以后重复使用,写出自己总结的类库可扩展性:添加功能无需修改原来代码灵活性:代码接口可以灵活调用面向对象六大原则单一职责:一个类别太大,别太累,负责单一职责,高内聚低耦合开闭原则:对扩展开发,对修改关闭,尽量不修改原来代码的情况下进行扩展;抽象化,多态是开闭原则的关键里氏替换:所有使用父类的地方,必须能够透明的使用子类对象依赖倒置:依赖抽象,而不依赖具体;面向抽象编程
2021-08-16 23:40:21 75
原创 设计模式----原型(Prototype)&备忘录(Memento)&模板方法&状态模式
什么是原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象原型模式的核心就是一各clone方法1)java中自带2)实现原型模式需要实现标记型接口Cloneable3)一般会重写clone()方法4)如果只是重写clone()方法,而没有实现接口,调用时会报异常5)一般用于一个对象的属性已经确定,需要产生很多相同对象的时候,对象属性特别多6)需要区分深克隆和浅克隆/** * 浅克隆 */public class Test { ..
2021-08-16 23:15:37 221
原创 算法数据结构(二十三)----单调栈(一)
单调栈是什么?一种特别设计的栈结构,为了解决如下的问题:给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息1)arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪?2)arr[i]的右侧离i最近并且小于(或者大于)arr[i]的数在哪?如果想得到arr中所有位置的两个信息,怎么能让得到信息的过程尽量快。那么到底怎么设计呢?题目一单调栈实现没重复值的单调栈实现:1)栈中元素存数组下标2)栈按元素值从小到大排序3)当新来的一个.
2021-08-16 22:25:28 307
原创 算法数据结构(二十二)----滑动窗口
滑动窗口是什么?滑动窗口是一种想象出来的数据结构:滑动窗口有左边界L和有边界R在数组或者字符串或者一个序列上,记为S,窗口就是S[L..R]这一部分L往右滑意味着一个样本出了窗口,R往右滑意味着一个样本进了窗口L和R都只能往右滑滑动内最大值和最小值的更新结构窗口不管L还是R滑动之后,都会让窗口呈现新状况,如何能够更快的得到窗口当前状况下的最大值和最小值?最好平均下来复杂度能做到O(1)利用单调双端队列!题目一假设一个固定大小为W的窗口,依次划过ar.
2021-08-15 22:42:12 998 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 187
原创 设计模式----建造者模式 Builder &适配器 Adapter&桥接 Bridge&Command命令
1.建造者模式 Builder主要用于构建复杂对象将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示//一个复杂对象 ,有非常多的属性,构建的时候可以通过构建器选择自己需要的属性//构建出自己需要的对象public class Person { int id; String name; int age; double weight; int score; Location loc; priva...
2021-08-11 23:51:30 396 1
原创 算法数据结构(二十)----暴力递归改动态规划(五)
题目一给定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 253
原创 设计模式----访问者 Visitor&门面模式
在结构不变的情况下动态改变对于内部元素的动作应用:抽象语法树通用类图:举例:不同角色的人,来买电脑给出不同的优惠//电脑public class Computer { ComputerPart cpu = new CPU(); ComputerPart memory = new Memory(); ComputerPart board = new Board(); public void acccept(Visitor v) {...
2021-08-10 23:48:51 108
原创 算法数据结构(十九)----暴力递归改动态规划(四)
题目一给定一个二维数组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 289 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 245 1
原创 设计模式----迭代器模式
它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节迭代器模式一般使用在容器与遍历上1.定义迭代器接口//定义迭代器接口public interface Iterator_<E> { //Element //Type //K //Value V Tank boolean hasNext(); E next(); //Tank next() Iterator_<Tank> it = ... Tank t = it.next();..
2021-08-09 22:07:40 85
原创 设计模式----代理模式
为其他对象提供一种代理以控制对这个对象的访问分为静态代理和动态代理静态代理1.tank和tank代理类实现同一个接口2.为tank生成两个代理类,每个代理类在执行tank的move方法时,都通过不同的手段实现方法的增加。3..TankLogProxy:在调用tank的move方法时,前后打印日志4.TankTimeProxy:在调用tank的move方法时,前后打印时间/** * 问题:我想记录坦克的移动时间 * 最简单的办法:修改代码,记录时间 * 问题2:如果.
2021-08-09 21:58:16 84
原创 设计模式----组合模式Composite&享元模式Flyweight
组合模式一般处理树状结构的将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。//定义树形结构中节点接口abstract class Node { abstract public void p();}//叶子节点类型class LeafNode extends Node { String content; public LeafNode(String content) {this.content = c...
2021-08-07 21:59:00 114
原创 算法数据结构(十七)----暴力递归改动态规划(二)
题目一 :背包问题给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值。给定一个正数bag,表示一个载重bag的袋子,你装的物品不能超过这个重量。返回你能装下最多的价值是多少? 从左往右尝试模型暴力递归// 所有的货,重量和价值,都在w和v数组里 // 为了方便,其中没有负数 // bag背包容量,不能超过这个载重 // 返回:不超重的情况下,能够得到的最大价值 public static
2021-08-07 21:45:49 362
原创 算法数据结构(十六)----暴力递归改动态规划(一)
怎么尝试一件事?1)有经验但是没有方法论?2)怎么判断一个尝试就是最优尝试?3)难道尝试这件事真的只能拼天赋?那我咋搞定我的面试?4)动态规划是啥?好高端的样子哦…可是我不会啊!和尝试有什么关系?最强的私货来了!-> 暴力递归到动态规划的套路!解决任何面试中的动态规划问题!什么暴力递归可以继续优化?有重复调用同一个子问题的解,这种递归可以优化如果每一个子问题都是不同的解,无法优化也不用优化暴力递归和动态规划的关系某一个暴力递归,有解的重复调用,就可..
2021-08-06 22:30:59 215
原创 设计模式----观察者模式
观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新观察者模式通常有3个角色:1)Event:事件类型2)source:被观察者3)listener:观察者平时所看见的,Observer、Listener、Hook和Callback基本都属于观察者模式...
2021-08-05 23:30:24 102
原创 算法数据结构(十五)----暴力递归
暴力递归就是尝试 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 223
原创 设计模式---责任链模式
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止例子1:字符串过滤//消息类class Msg { String name; String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg;.
2021-08-04 23:55:53 83
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人