左神算法
左神算法
qxlxi
21届本,后端工程师 (专注于Java、Go、数据库、缓存、消息队列、网络、OS、算法、软件设计、DevOps、云原生、大数据、分布式系统架构设计等)
展开
-
【左神算法】栈逆序
1.问题一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。2.codepackage com.ncst.offer.ch1.offer.ch2;/** * @author i * @create 2020/7/20 18:16 * @Description */public class StackReverse { publ原创 2020-07-20 18:49:38 · 814 阅读 · 0 评论 -
【左神算法】Manacher问题
核心解决的是字符串中寻找最长回文问题package com.ncst.improve.one;/** * @author i * @create 2020/7/1 16:57 * @Description 字符串最长回文问题 */public class Code_04_Manacher { //为字符串前后添加一个 # A#B#A public static char [] manacherString(String str){ char[] chars原创 2020-07-01 17:29:31 · 385 阅读 · 0 评论 -
【左神算法】括号匹配问题
1.问题1、已知一个字符串都是由左括号(和右括号)组成,判断该字符串是否是有效的括号组合。例子:有效的括号组合:()(),(()),(()())无效的括号组合:(,()),((),()(()2、题目进阶:已知一个字符串都是由左括号(和右括号)组成,返回最长有效括号子串的长度。2.code//1.当遇到不是( )的符号时 直接返回false;//2.遇到 ) status<0 返回false//3.遇到( status就++package com.ncst.offer.ch1原创 2020-07-01 14:56:22 · 561 阅读 · 0 评论 -
【左神算法】有一排正数,玩家A和玩家B都可以看到。 每位玩家在拿走数字的时候,都只能从最左和最右的数中选择一个。 玩家A先拿,玩家B再拿,两人交替拿走所有的数字, 两人都力争自己拿到的数的总和比对方多
1.问题有一排正数,玩家A和玩家B都可以看到。每位玩家在拿走数字的时候,都只能从最左和最右的数中选择一个。玩家A先拿,玩家B再拿,两人交替拿走所有的数字,两人都力争自己拿到的数的总和比对方多。请返回最后获胜者的分数。例如:5,2,3,4玩家A先拿,当前他只能拿走5或者4。如果玩家A拿走5,那么剩下2,3,4。轮到玩家B,此时玩家B可以选择2或4中的一个,…如果玩家A拿走4,那么剩下5,2,3。轮到玩家B,此时玩家B可以选择5或3中的一个,…2.思路&code2.1 win1原创 2020-07-01 11:21:41 · 868 阅读 · 0 评论 -
【左神算法】全球id设计问题
1.问题设计一个针对全球的、访问量极大的id生成系统。必须保证用户每次从该系统得到的id是唯一的,而且在概率上毫无碰撞可能。2.解决在国际服务器上设定一个startID,比如 中国服务器需要100亿的id,那么设定一个range,startID-1000亿之间。让中国子服务器在这个范围之内随机生成,而国际服务器只需要考虑startID和Range范围。生成id的业务交给下游的子服务器去完成,很大程度上避免了国际服务器的压力,也保证了id的唯一性。...原创 2020-07-01 10:11:41 · 357 阅读 · 0 评论 -
【算法】 KMP算法
1.思路字符串匹配,通常我们使用的是互相比较,也就是 str1 : ABCABCD st2 : ABCABCTstr1 和 str2按照顺序比较。当匹配到str1的D 和 str2的T位置可以发现,不等。则直接从str1的第一个A+1位置在匹配。可以发现这样就是穷举的方法,相对来说是一种时间复杂度比较高的。因此,就出现了KMP算法。KMP字符串匹配算法: KMP的核心思想是先计算出当前字符的最长前缀和最长后缀的最长长度。不包含第一个前缀和最后一个后缀。举一个栗子,ABCABCD D的最长子串是多少原创 2020-06-30 18:53:18 · 748 阅读 · 1 评论 -
【左神算法】实现一个栈的逆序,但是只能用递归函数的这个栈本身的操作来实现,而不能用自己申请另外的数据结构
1.题目描述实现一个栈的逆序,但是只能用递归函数的这个栈本身的操作来实现,而不能用自己申请另外的数据结构2.思路&code思路1.栈的逆序,如果不借助任何的数据结构,我们只能依靠递归函数来实现。而这个思路也是不容易想到的。首先,我们需要一个get()函数,每次返回栈底的元素,并在栈中移除。递归函数是一个系统调用栈实现。因此很容易实现。第二个函数,reverse函数,将栈中的元素进行逆序。codepackage com.ncst.algo;import java.util.Stac原创 2020-06-29 21:54:47 · 398 阅读 · 0 评论 -
【左神算法】牛数量问题
1.题目母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只母牛,假设不会死。求N年后,母牛的数量。2.code2.1 思路F(n) = F(n-1) + F(n-3)2.2 code public static int cowNumber1(int n) { if (n < 1) { return 0; } if (n == 1 || n == 2 || n == 3) { return n; } return cowNumber1(n -原创 2020-05-25 16:11:01 · 628 阅读 · 0 评论 -
【算法】最好的安排
1.题目一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面 是一个个具体的项目),你来安排宣讲的日程,要求会议室进行 的宣讲的场次最多。返回这个最多的宣讲场次。2.code2.1 思路思路:主要在于贪心的策略上,是会议开始时间早的先开始,还是会议时间短的先开始,或者会议先结束的先开始。我们采用会议结束时间短的作为贪心策略。2.2 code public static class Program {原创 2020-05-25 14:44:55 · 564 阅读 · 1 评论 -
【左神算法】IPO问题
502. IPOIPO难度困难39假设 力扣(LeetCode)即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k个不同项目后得到最大总资本的方式。给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。最初,你有 W资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。原创 2020-05-25 12:21:54 · 505 阅读 · 0 评论 -
【左神算法】最少钱
1.题目一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分整块金 条,怎么分最省铜板?例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长度60的金条分成10和50,花费60 再把长度50的金条分成20和30,花费50 一共花费110铜板。但是如果, 先把长度60的金条分成30和30,花费60 再把长度30金条分成1原创 2020-05-25 10:31:55 · 434 阅读 · 0 评论 -
【算法】设计RandomPool结构
1.题目设计RandomPool结构 【题目】 设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。 delete(key):将原本在结构中的某个key移除。getRandom(): 等概率随机返回结构中的任何一个key。 【要求】Insert、delete和getRandom方法的时间复杂度都是 O(1)2.思路题目要求必须是O(1)的时间复杂度,那么上哈希表就可以了,但是随机返回等概率的key 哈希表是做不到的,因此,我们可以借助两原创 2020-05-19 16:52:22 · 316 阅读 · 1 评论 -
【左神算法】在二叉树中找到一个节点的后继节点
题目在二叉树中找到一个节点的后继节点【题目】 现在有一种新的二叉树节点类型如下:public class Node { public int value; public Node left;public Node right; public Node parent;public Node(int data) { this.value = data; }}该结构比普通二叉树节点结构多了一个指向父节点的parent指针。假设有一 棵Node类型的节点组成的二叉树,树中每个节点的parent指针原创 2020-05-17 15:53:13 · 502 阅读 · 0 评论 -
【左神算法】判断一棵二叉树是否是平衡二叉树
题目判断一棵二叉树是否是平衡二叉树思路平衡二叉树的特点是左右子树的高度差不超过1 只需要递归查找左右子树的高度进行比较,这里再次简述一下递归的三个要点。1.终止条件 2.逻辑处理 3.drll down不要进行人肉递归,只需要考虑root节点的左右子树的高度 将问题简单话,寻找重复子问题。code private boolean flag = true;//是否平衡 public boolean IsBalanced_Solution(TreeNode root) {原创 2020-05-17 15:27:54 · 542 阅读 · 1 评论 -
【左神算法】判断一颗树是不是完全二叉树
题目判断一棵树是否是完全二叉树思路完全二叉树 依序从左到右添加节点 。满二叉树是完全二叉树 完全二叉树不是满二叉树、那么对于几个节点就可能出现4种情况a.该节点左右孩子都存在。b.该节点左孩子不不存在 右孩子存在 不是完全二叉树c.该节点左孩子不存在 右孩子也不存在 是d.该节点左右孩子都不存在 是code/** * @author i * @create 2020/5/17 14:49 * @Description 判断一颗树是不是完全二叉树 * 完全二叉原创 2020-05-17 15:13:02 · 674 阅读 · 0 评论 -
【左神算法】验证一个树是否为二叉搜索树
题目验证一个树是否为二叉搜索树思路思路:根据二叉搜索树的特点 左子树小于根节点 右子树大于根节点而中序遍历的结果就是一个有序的结果,因此 只要中序遍历的时候 依次比较前一个元素的大小 如果小于不是二叉搜索树否则的话就是一个二叉搜索树。code** * @author i * @create 2020/5/17 14:37 * @Description 验证二叉搜索树 * 思路:根据二叉搜索树的特点 左子树小于根节点 右子树大于根节点 * 而中序遍历的结果就是一原创 2020-05-17 14:42:00 · 398 阅读 · 0 评论 -
【左神算法】已知一棵完全二叉树,求其节点的个数
1.题目已知一棵完全二叉树,求其节点的个数要求:时间复杂度低于O(N),N为这棵树的节点个数2.思路&code2.1 思路一般来说,我们遍历二叉树需要O(n)的时间复杂度,必须将每个节点进行统计才可以计算出节点的总数。但是我们可以从完全二叉树的特点出发,完全二叉树只有当右子树满的情况,添加一个节点,会依序从左子树到右子树。1.先递归查找二叉树的最高深度,也就是左子树的深度。high2.然后将root.right 右子树的左子树的深度和最高深度high比较,a.如果右子树的左子树原创 2020-05-17 12:35:55 · 1436 阅读 · 0 评论 -
【左神算法】二叉树的先序、中序、后序遍历,包括递归方式和非递归方式
二叉树的先序、中序、后序遍历,包括递归方式和非递归方式1、二叉树的前序遍历1.1 思路:二叉树是一个由left子节点和right子节点 以及val组成的数据结果。而前序遍历的过程就是 根左右。而实现前序遍历,我们可以用两种方式一种是递归实现,先添加val,递归左右子节点。一种非递归实现,递归的实现就是系统帮我们自行压栈操作,因此可以借助栈结构来实现。先添加root节点,当栈不为null 保存root.val 以及压入左子节点和右子节点。如此反复。时间复杂度:二叉树的遍历需要花费O(n) 如果不原创 2020-05-15 11:19:26 · 1302 阅读 · 0 评论 -
【左神算法】回文链表
题目判断一个链表是否为回文结构 【题目】 给定一个链表的头节点head,请判断该链表是否为回文结构。 例如: 1->2->1,返回true。1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。1.借助栈实现1.1 思路栈是一个先进后出的结果,如果一个链表是回文的话 那么势必 出栈的val 等于 正序的v原创 2020-05-14 19:05:57 · 486 阅读 · 0 评论 -
【左神算法】队列实现栈
队列实现栈/** Initialize your data structure here. */ private Queue<Integer> q; private Integer tail;//记录栈顶元素 public MyStack() { q = new LinkedList<>(); tail = 0; } /** Push element x onto stack. */ pub原创 2020-05-11 17:45:30 · 303 阅读 · 0 评论 -
【左神算法】栈实现队列
栈实现队列思路使用两个栈(一个压入栈,一个弹出栈)实现一个队列。要注意在弹出元素栈的地方要注意栈的变化,每次压入栈中的元素移动到弹出栈时,要全部移动。当弹出栈中有元素的时候,不能从压入栈中移动元素到弹出栈中。code/**使用两个栈(一个压入栈,一个弹出栈)实现一个队列。要注意在弹出元素栈的地方要注意栈的变化,每次压入栈中的元素移动到弹出栈时,要全部移动。当弹出栈中有元素的时候,不能从压入栈中移动元素到弹出栈中。 */ private Stack<Integer> in;原创 2020-05-11 16:52:50 · 310 阅读 · 0 评论 -
【左神算法】包含min函数的栈
min函数的栈思路 思路 使用两个栈 一个栈存储数据 一个栈 存储最小值 push()->data栈直接添加 min去记录当前每次push之后的最小值,并将最小值直接添加到minStack栈中 pop()->dataStack和minStack直接pop 当minStack为null将Integer.MaxValue赋值给minValue 否则的话 将minStack当前栈顶的最小元素赋值给minValuecode cl原创 2020-05-10 18:37:45 · 246 阅读 · 0 评论 -
【左神算法】数组实现队列
数组实现队列思路实现思路:队列的结构是先进先出、last->队尾 fast->队头 size->已有元素 arr->数组 * add() 添加元素 先判断是否超过存储长度 否则size++ last++ 如果last长度超过size 从新开始 * peek()->查看队列头元素 先判断队列是否为空 然后直接arr[fast] * poll()->查看队列尾元素 先判断队列是否为空 然后返回arr[fast] f原创 2020-05-10 18:35:38 · 261 阅读 · 0 评论 -
【左神算法】数组实现栈
数组实现栈思路 数组实现栈 * 思路:栈是一个先进后出结构。比如 1,2,3 pop()第一个数为3 * 我们用size表示数组中已有数的大小。 * push():> 先判断数组是否超过了initSize的大小 添加数据 size++ * pop():> 先判断数组是否为空 然后弹出数据 size-- * peek():>查看栈顶元素 直接返回arr[size-1]; 为什么需要-1 因为在添加数据的时候 * size++原创 2020-05-10 18:34:15 · 325 阅读 · 0 评论 -
【左神算法】给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。
1.题目给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。2.实现2.1 思路 问题: * 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的 排序。 * 比如 数组[1,2,9,4,6] sort后 [1,2,4,6,9] 6-9之间间隙最大值就为3. * 思路: * 我们可以基于桶排序的思想来解决这个问题。data[1,2,3,4,5,7,原创 2020-05-09 20:57:18 · 819 阅读 · 2 评论 -
【算法】堆排序
堆排序思路思路:堆排序是比较重要的排序,主要是基于堆结构。而堆结构就是完全二叉排序树。因为二叉排序树的结构特点。 * 我们可以用数组进行模拟二叉树的左右子节点, 关系就是 root节点的左子节点为 2*i + 1 root节点的右子节点为 2*i+2 * 而左子节点或者右子节点的父节点为 (i-1)/2 ,通过上述关系就可以通过数组来实现堆结构。 * 而堆结构中比较重要的两个操作就是 一个是节点的生成 也就是heapInsert 比如添加一个节点3 需要父节点比较大小原创 2020-05-08 17:52:03 · 307 阅读 · 1 评论 -
【左神算法】随机+荷兰国旗优化版快排
随机+荷兰国旗优化版快排思路: 快速排序 time O(NlogN) space : O(logN) * 实现思路: * 经典快排,分区是按照数组的最后一个元素进行分区,而在分区的过程中,每次只能确定一个元素的位置。因此,当出现 极端情况 * [1,2,3,4,5,6] or [9,8,5,3,1] 这种已经排序好的情况,time 为...原创 2020-05-08 17:01:59 · 682 阅读 · 1 评论 -
【左神算法】荷兰国旗问题
1.问题荷兰国旗问题给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间, 大于num的数放在数组的右边。2.code思路:荷兰国旗问题的解决 * 1.设定less 为-1 位置 more 为arr.length位置 cur为当前移动的 在0位置 * a.终止条件 cur < more 一直执行...原创 2020-05-08 13:07:30 · 439 阅读 · 0 评论 -
【左神算法】对数器
1.计数器概念对数器的概念和使用0,有一个你想要测的方法a,1,实现一个绝对正确但是复杂度不好的方法b,2,实现一个随机样本产生器3,实现比对的方法4,把方法a和方法b比对很多次来验证方法a是否正确。5,如果有一个样本使得比对出错,打印样本分析是哪个方法出6,当样本数量很多时比对测试依然正确,可以确定方法a已经正确。2.代码体现1.有一个你想要测的方法a,测试一个冒泡排...原创 2020-03-23 22:00:05 · 1139 阅读 · 0 评论