
数据结构与算法
gtmd数据结构
大巴黎咚咚咚
面向工作编程
展开
-
专题二分法 力扣278 第一个错误的版本号
题目你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。示例:给定 n = 5,并且 v原创 2020-08-21 14:43:56 · 134 阅读 · 0 评论 -
专题二分法 力扣69求x的平方根
回来刷专题了思路套的二分查找,[0,x]查找mid,如果mid2<=xmid^{2}<=xmid2<=x并且(mid+1)2>x(mid+1)^{2}>x(mid+1)2>x,返回midmid2<xmid^{2}<xmid2<x并且(mid+1)2<=x(mid+1)^{2}<=x(mid+1)2<=x这里要分情况讨论,如果(mid+1)2=x(mid+1)^{2}=x(mid+1)2=x,说明mid+1是要找的值,否则说原创 2020-08-21 11:13:05 · 221 阅读 · 0 评论 -
day18 二叉树中的最大路径和
leetcode 124 二叉树中的最大路径和没看懂题目什么意思,先从群里大佬那里偷来个思路研究研究借鉴地思路对于二叉树的问题,可以将其抽象成一种简单的结构,即: 根/ 左子树 右子树对于这道题目同样如此,题目要求任意节点出发到达任意节点的最大路径和。根据上面抽象出来的结果,我们最多能够得到三条满足题意的路径:左子树最大路径和 + 根右子树最大路径和 + 根左子树 + 根 + 右子树这就是所有的路径了, 按照题目求出他们之间的最大值即是题目的结果。不过需要注意的一点是,如转载 2020-06-18 20:55:08 · 164 阅读 · 0 评论 -
day17 构造二叉树
leetcode 105 从前序与中序遍历序列构造二叉树这道题感觉好难,但是通过这道题也学到了好多东西构成二叉树中序序列和前、后,层次序列任一组合唯一确定一颗二叉树。前、后,层次序列都是提供根结点的信息,中序序列用来区分左右子树;没有中序遍历是无法构成一棵二叉树的前序、中序、后续遍历还原二叉树关于这部分,这个大佬写的很棒还原二叉树一、前序+中序根据前序序列的第一个元素建立根结点;在中序序列中找到该元素,确定根结点的左右子树的中序序列;在前序序列中确定左右子树的前序序列;由左子树的前原创 2020-06-18 00:11:54 · 360 阅读 · 0 评论 -
day16 树左下角的值 深拷贝
leetcode 513 树左下角的值这道题BFS DFS都可以做BFS思路:遍历每一层,把每一层最左边的节点值打印出来DFS思路:找到最深的一层,打印这一层最左边的节点的值我是用BFS做的,套用BFS模板bfs(root) { queue = [] queue.push(root) while queue.length { curLevel = queue queue = [] for i = 0 to curLevel.length { doSomething(cur原创 2020-06-16 22:30:14 · 161 阅读 · 0 评论 -
三色法遍历二叉树
三色法遍历二叉树今天群里大佬说三色法遍历二叉树,前序遍历、中序遍历、后续遍历只需要改一点就行,对这个方法非常好奇算法介绍我们知道垃圾回收算法中,有一种算法叫三色标记法。 即:用白色表示尚未访问灰色表示尚未完全访问子节点黑色表示子节点全部访问那么我们可以模仿其思想,使用双色标记法来统一三种遍历。其核心思想如下:使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。如果遇到的节点为灰色,则将节点的值原创 2020-06-16 18:24:56 · 658 阅读 · 0 评论 -
根到叶子节点的数字之和 day15
leetcode 129求根到叶子节点数字之和思路找到每一条从根到叶子的路径,把值算出来存到列表里,最后加起来,时间复杂度O(nlogn)O(nlogn)O(nlogn),还没想到其他好办法原创 2020-06-15 21:14:46 · 122 阅读 · 0 评论 -
相同的树 day14
leetcode 100 相同的树思路这道题比较简单,我的想法就是递归比较树的节点值是不是相等,递归出口是树是否为空public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) return true;//都是空,返回true if ((p == null && q != null) || (q == null && p !原创 2020-06-14 21:43:05 · 127 阅读 · 0 评论 -
二叉树的最大深度 day13
leetcode 104 二叉树的最大深度树计算机的数据结构是现实世界物体间关系的一种抽象。家族的族谱,公司架构中的人员组织关系,电脑中的文件夹结构,html渲染的dom结构等等,这些有层次关系的结构在计算机领域都叫做树。树是一种非线性数据结构。树结构的基本单位是节点。节点之间的链接,称为分支(branch)。节点与分支形成树状,结构的开端,称为根(root),或根结点。根节点之外的节点,称为子节点(child)。没有链接到其他子节点的节点,称为叶节点(Leaf)。简单的二叉树class Tr原创 2020-06-14 13:50:37 · 191 阅读 · 0 评论 -
LRU缓存机制day12
leetcode 146LRU缓存机制LRULRU缓存算法是一种缓存淘汰策略。计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删原创 2020-06-14 11:37:05 · 124 阅读 · 0 评论 -
环形链表 哈希 双指针day11
leetcode 142 环形链表思路先判断列表是不是空的或者是不是只有一个元素,如果是直接返回null死循环将列表的值逐一加入到hash表中(因为可能是环形的),如果遇到节点是null或者hash表中有值和遍历到的节点值相等,跳出循环,返回当前节点值public static ListNode detectCycle(ListNode head) { Set<ListNode> nodeset=new HashSet<>();//创建hash表原创 2020-06-11 22:32:49 · 150 阅读 · 0 评论 -
相交链表 哈希 双指针day10
leetcode 160 相交链表本题我个人只想到了一种方法:使用hash,因为hash值是唯一的,这样可以不用担心链表值的冲突,然后查阅题解发现了另一种不错的思路思路hash有A, B这两条链表, 先遍历其中一个,比如A链表, 并将A中的所有节点存入哈希表。遍历B链表,检查节点是否在哈希表中, 第一个存在的就是相交节点时间复杂度O(m+n)O(m+n)O(m+n)public ListNode getIntersectionNode(ListNode headA, ListNod原创 2020-06-11 18:31:03 · 244 阅读 · 0 评论 -
快慢指针 有序链表转二叉搜索树day09
leetcode 109 有序链表转换二叉搜索树补充知识点二叉搜索树二叉排序树:BST,对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大如果有相同的值,可以将该节点放在左子节点或右子节点快慢节点链表用快慢指针寻找中点:slow = slow.next;fast = fast.next.next;假设快慢指针原来都指向头结点,这样的话,fast指针移动速度就是slow指针的两倍,这样在快指针到达末尾时,慢指针正好到中点位置思路原创 2020-06-10 22:42:48 · 163 阅读 · 0 评论 -
扁平化多级双向链表 day08
leetcode 430 扁平化多级双向链表思路思考良久,没有想到什么好方法,这时候只能按部就班分情况讨论链表有子节点当前节点是否为空?当前节点为空temp.next = temp.child;//temp表示当前节点temp.child = null;temp.next.prev = temp;temp = temp.next;当前节点不为空先把当前节点的下一个节点入栈,再执行上边的操作stack.add(temp.next);temp.next = temp.child;//原创 2020-06-10 21:44:16 · 125 阅读 · 0 评论 -
反转链表 day07(真)
leetcode 206 反转链表链表复习单向链表定义一个简单的链表class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}反转链表此处借点大佬的博客,写的超级好,建议大家看一下反转链表借鉴处方法一先对原链表做头删操作,再对新链表做头插方法二先对原链表做头删操作,再对新链表做头插代码实现public ListNode reverseList(ListNo原创 2020-06-07 15:38:28 · 230 阅读 · 0 评论 -
验证回文串 day07(伪)
leetcode 125 验证回文串上午12点了,今天的题目还没出来,开始以为今天不会有题目,Lucifer老师去过周末了,就去接着刷最热100了,刚写完这个今天的题目和讲义就出来了。。。淦!思路拿到题目看到字符串有不是那种“干净”的字符串,于是想先清洗数据,再判断回文。对字符串进行切割,使用正则判断是不是大小写字母或者数字,如果是字母,统一变成小写,拼到一个新的字符串中回文判断使用的双指针时间复杂度O(n),大部分时间花在清洗数据上面了public static boolean isPal原创 2020-06-07 14:33:46 · 198 阅读 · 0 评论 -
常数时间插入、删除、获取元素 哈希表day06
leetcode380 常数时间插入、删除和获取随机元素这道题想到了使用哈希表,但是单使用哈希表并不能直接做到返回随机值O(1)。想了一个小时都没想到怎么做,然后本弱鸡厚颜无耻的取看了题解,思路参考本题的官方题解复习哈希表介绍定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key)而直接进行访问的数据结构。散列表可以使用数组 + 链表的方式来实现。哈希函数:哈希表查找过程是根据Key来算出hashcode(通常是一个数字),根据这个数字来随机访问数组,而理论上两个不同的key原创 2020-06-06 17:18:35 · 534 阅读 · 0 评论 -
栈实现队列day05
leetcode 232 用栈实现队列复习队列队列是逻辑结构,底层可以用数组实现,也可以用链表实现,不同实现有不同的取舍。队列也是数据结构的其中一种,和栈相反的是。队列是只允许在一端进行插入,在另一端进行删除的线性表。与栈一样,队列也是一种受限的数据结构队列(Queue)是一种先进先出(FIFO - First In First Out)的数据结构队列中,插入元素会发生在尾部而删除元素会发生在头部 - 先进先出原则队列的操作插入 - 在队列的尾部添加元素删除 - 在原创 2020-06-05 22:10:40 · 253 阅读 · 0 评论 -
字符串解码 day04
leetcode394 字符串解码这道题比较直观的联想到使用栈来处理,我的思路是:遍历字符串,从左往右依次入栈,遇到能合并的先合并然后加入栈比如232[asc]33[ass]先把232、asc、33、ass拼成一个字符串加入栈中遇到一个右括号就开始往外弹,至于弹多少个元素判断栈顶是不是左括号如果当前栈顶是左括号,我们需要弹出两次栈,取出需要增加多少倍的那个数字,代码写的比较简单,应该挺好理解public static String decodeString(String s) {原创 2020-06-04 22:29:59 · 200 阅读 · 0 评论 -
增量操作的栈 day03zenl
leetcode1381这道题总的来说比较简单,就是实现栈这个数据结构,那么先复习一下什么叫栈栈栈只允许新的内容从一个方向插入或删除,这个方向我们叫栈顶,而从其他位置获取内容是不被允许的栈最显著的特征就是LIFO(Last In, First Out - 后进先出)常用操作进栈 - push - 将元素放置到栈顶退栈 - pop - 将栈顶元素弹出栈顶 - top - 得到栈顶元素的值是否空栈 - isEmpty - 判断栈内是否有元素代码实现定义一个指针rear,用来表示栈尾原创 2020-06-03 17:19:47 · 177 阅读 · 0 评论 -
颜色分类问题 快速排序day02
颜色分类问题 leetcode 75这道题我开始当成排序题做了,因为要求是进行原地排序,所以我使用的是插入排序public static void sortColors(int[] nums) {// 使用插入排序 if (nums.length<2||nums==null) return; for (int i = 1; i <nums.length ; i++) { for (int j = i-1; j >原创 2020-06-02 21:52:19 · 210 阅读 · 0 评论 -
day01加一
leetcode 66题在写之前我想到了类似于[9,9,9]或者[8,8,9]这种最后一位是9的情况,因此我优先创建了一个长度+1的数组然后把原数组最后一位+1。public static int[] plusOne(int[] digits) { int j=digits.length-1; int add=0;//设置进位,这个值根据前一位%10确定是1还是0 digits[digits.length-1]=digits[digits.length原创 2020-06-02 16:30:08 · 232 阅读 · 0 评论 -
写在最前
致谢感谢lucifer大佬的91天教程班大家去大佬github项目star一下,真的非常棒大佬的github项目原创 2020-06-02 10:25:00 · 114 阅读 · 0 评论