
数据结构与算法-Java版
文章平均质量分 60
Leetcode 入门级教程,读完速刷200道,搞定大部分算法面试问题,现在专栏全场39.9,全场39.9...
持续更新数据结构与算法基础知识,帮助查漏补缺,买完后可持续关注!!!!!
CopyProfessor
不生产代码,只是代码的搬运工
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java版-速通基本的位运算操作
为了简单点儿,我们只使用四位0和1。对于四位0和1,我们能表示的正数范围为0000 ~ 1111(0~15);如果最高位用作符号位,0表示正数,1表示负数,则能表示的数字范围为(-7~7);首先来看最简单的正数情况,如果为正数,那么原码,反码,补码规定为一致的;所以我们下面的讨论,主要是针对有符号位的负数。原创 2024-12-04 14:26:46 · 259 阅读 · 0 评论 -
Java版-速通数组基础知识
我们首先来看一个数组的查找问题,对于升序数组nums,在数组中查找target,并返回target在nums中的索引位置。如果未找到返回-1。首先我们用最简单的无脑暴力法,从index=0的位置开始,往后依次对比,如果对比成功返回当前位置,如果不成功返回-1.index++) {return -1;从平均时间复杂度来看,这段代码复杂度为O(n)。再回到题目,数组nums是升序的,这一点是我们在代码中没有利用到的条件,如果我们第一次先去比较数组中间的数字,如果。原创 2024-12-04 14:37:46 · 141 阅读 · 0 评论 -
Java版-算法基础-前缀和—— 一维数组和二维数组的前缀和
一维数组前缀和定义应用示例二维数组前缀和定义应用示例原创 2021-09-28 21:56:15 · 387 阅读 · 2 评论 -
Java版-字符串算法-超简单KMP实现讲解
最长公共前后缀 /** * 获取最长公共前后缀长度 * * @param s * @return */ private int[] getNext(String s) { int[] result = new int[s.length()]; int len = 0, i = 1; while (i < s.length()) { if (s.charAt(i) == s原创 2020-07-16 15:06:43 · 1081 阅读 · 3 评论 -
Java版-字符串算法-求解最长回文字串——Manacher 算法
之前用动态规划法和中心扩散法求解过这个问题,复习戳这里:LeetCode——5,最长回文子串,看这篇之前,如果不是很明白这个问题的通用解法,先看懂这个再往下看。鉴于dp和中心扩散法,时间复杂度都为n,在这里,我们对中心扩散法进行优化,去掉多次访问同一位置,将中心扩散法优化为时间复杂度为n的算法。 /** * Manacher -- n复杂度算法 * * @param s * @return */ public String longestPali原创 2020-07-09 15:34:15 · 521 阅读 · 0 评论 -
Java版-数据结构-并查集模板1-路径压缩和按秩合并
并查集的概念引人并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。并查集是一种树型的数据结构,原创 2021-03-27 14:04:44 · 413 阅读 · 0 评论 -
Java版-速通链表的基本操作
对于线性表来说,主要由顺序表示或链式表示。其中,顺序表示,我们在对应到实现的时候,经常使用数组进行实现。利用数组来实现一个线性的结构,好处是元素随机访问的时间复杂度都控制在常数内,并且元素的物理存放位置固定。但是用数组存放,如果遇到数组空间不足的情况,常常需要进行扩容操作,如,我们Java中常见的的ArrayList实现,在进行扩容的时候,需要将原数组数据拷贝到新的数组空间中,这一操作数据量较大时候比较耗时。原创 2024-12-04 14:48:45 · 148 阅读 · 0 评论 -
Java版-速通队列和栈的基本操作
队列是种先进先出的数据结构。队列的基本操作主要是入队和出队。数据从队尾进入队列,从队首出队列。其中,pointer代表头队首第一个位置的数据。当头部有数据出队时,对应的pointer指针会往后移动一位。如果有数据入队,会直接加在队尾:我们会发现,随着队首数据的数据的出队,队首指针之前的空间都会被浪费掉,而且随着使用次数变多,空间浪费会越来越高。为了重复使用这部分空间,避免浪费,我们可以设计一个队首与队尾相连接的队列,重复利用空间。原创 2024-12-04 14:53:32 · 430 阅读 · 0 评论 -
Java版-队列广度优先搜索(BFS)
int BFS(Node root, Node target) { Queue<Node> queue = new LinkedBlockingQueue(); // store all nodes which are waiting to be processed int step = 0; // number of steps nee...原创 2019-07-03 17:30:19 · 947 阅读 · 0 评论 -
Java版-深度优先搜索(DFS)
/** * \* Created: liuhuichao * \* Date: 2019/7/12 * \* Time: 27:00 PM * \* Description: 深度优先搜索 - DFS * \ */public class DFS_Temple { /* * 基于递归的模板 */ boolean DFS(Node cur, No...原创 2019-07-16 21:47:41 · 448 阅读 · 0 评论 -
Java版-LRU Cache实现
LRU全名是:Least recently use 简单的说就是:最近最少使用。核心思想有以下几点:1,当空间不足时候,先淘汰掉最不常使用到的数据。2,经常访问到的数据的优先级比较高。下面来看几种LRU Cache的简单java实现。使用LinkedList实现class Node { int key; int value; Node(int key, int value) { this.key = key;原创 2020-07-04 14:18:49 · 370 阅读 · 0 评论 -
Java版-速通数据结构-树基础知识
BST1,每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值2,每个节点中的值必须小于(或等于)存储在其右子树中的任何值我们可以把BST看成是进化了的二叉树。而且观察BST的这个特点,是不是让你想起来我们之前说过的数组的二分法,利用二分法对有序数组进行查找,可以提高搜索效率。如果对BST进行搜索,我们也可以充分利用BST的特征。根节点不包含字符,除根节点外每一个节点都只包含一个字符;从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;原创 2024-12-04 14:51:47 · 348 阅读 · 0 评论 -
Java版-算法基础-实现前缀树
class TrieNode { Boolean isWord; Character c; List<TrieNode> next; TrieNode() { isWord = false; } TrieNode(Character c) { ...原创 2019-09-02 22:47:26 · 451 阅读 · 0 评论 -
Java版-速通图的表示法-- 邻接表和邻接矩阵
邻接表邻接矩阵链式前向星存图原创 2024-12-04 16:19:11 · 157 阅读 · 0 评论 -
Java版-速通图的表示法--链式前向星
链式前向星最终的输出结果:以某个点,例如,上图中1点开始,然后找1为开头的边,输出终点和权重;原创 2024-12-05 16:35:11 · 155 阅读 · 0 评论 -
Java版-图论-拓扑排序与有向无环图
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。原创 2024-12-09 10:43:45 · 642 阅读 · 0 评论 -
Java版-速通ETL工具中简单的DAG执行实现
/节点id//节点名称//前置节点//节点是否执行完成//节点是否执行成功//节点输出数据//节点配置数据/*** 节点的具体执行*/= null &&!//前置节点都执行完了,可以开始执行本节点任务了//本节点执行完了,通知下@Overridetry {//一些失败的处理....节点包含必要的状态:完成情况,成功失败情况。原创 2024-12-04 14:56:17 · 464 阅读 · 0 评论 -
Java版-图论-最小生成树-Kruskal算法
为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。原创 2024-12-09 15:36:11 · 498 阅读 · 0 评论 -
Java版-图论-最小生成树-Prim算法
如图:Prim算法的基本思想是从一个顶点开始,逐步构建最小生成树。与Kruskal算法相比,Kruskal是选择最小边,通过判断连通性加入最小生成树;Prim算法是选择点,构成最小生成树,然后选择未加入的点,通过权重判断是否能加入最小生成树;下面是详细的构建过程:首先加入index=0的点,此时最小生成树包含了只有0;注意,此时最小生成树节点[0,5],是两个,这两个是一个整体;原创 2024-12-10 14:26:43 · 592 阅读 · 0 评论 -
Java版-图论-最短路-Floyd算法
根据上面提示,可以计算出,最大有100个点,最大耗时为100*wi,即最大的耗时为10000,任何耗时计算出来超过这个值可以理解为不可达了;原创 2024-12-10 15:57:19 · 427 阅读 · 0 评论 -
LeetCode刷题指南——数据结构
年后开始在刷LeetCode,刚开始就是从第一道题开始刷,后来刷了几道题之后,发现自己数据结构方面的知识好像忘得都差不多了,艾玛,就想着按照分类刷,又过了一段时间,我感觉刷起来还是有点儿艰难,就决定先刷下数据结构的基础知识:数据结构 刷完基础之后,再按照分类开始刷题。PS:我的LeetCode主页:https://leetcode-cn.com/soledadvac/ ;GitHub部分代码:...原创 2019-04-29 23:07:39 · 882 阅读 · 0 评论 -
动态规划问题3--多重背包
多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,我们可以在01背包基础上,增改下代码(这里面我们直接上一维数组的了,不讲空间优化了,有兴趣的可以去看前面写过的背包问题,已经写过了):/** * @param V 最大容量 * @param C 物品个数 * @param v 价值数组 * @param w原创 2021-09-09 17:51:07 · 361 阅读 · 0 评论 -
动态规划2——完全背包问题解析
完全背包问题描述有C种物品和一个容量为V的背包,每种物品都有无限件。第i件物品的体积是v[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。与之前的01背包不同的是,每个物品都有无限个,对于同一个物品,可以放置多个。基本解法首先还是先来用基本解法来一遍,不带优化的。先看多个物品的状态转移方程。当不选择该物品时候,这个时候值跟01背包的一样,还是dp[i - 1][fv];当选择该物品时候,对于一个固定容量,如果该物品能被放进去,要想价值最大,原创 2021-09-07 18:50:38 · 350 阅读 · 0 评论 -
动态规划1 —— 01背包详解
从斐波那契数列说起斐波那契数列(Fibonacci sequence),对于n(n>=0),n=0时,f(0)=0;n=1时,f(1)=1;n=2时,f(2)=f(0)+f(1);n=3时,f(2)=f(1)+f(2);以此类推…求解f(n)。最早 ,我们可能在课本上学过,这是个经典的递归问题,于是,能很很快写出递归的代码: public int fib(int N) { if (N == 0) { return 0; }原创 2021-09-03 18:37:14 · 414 阅读 · 0 评论 -
N叉树的遍历
前序遍历 public List<Integer> preorder(Node root) { List<Integer> res = new ArrayList<>(); if (root == null) { return res; } res.add(root.val...原创 2019-09-02 22:45:29 · 1748 阅读 · 0 评论 -
BST基本操作——搜索,插入,删除
搜索public TreeNode searchBST(TreeNode root, int val) { if (root == null) { return null; } if (root.val == val) { return root; } if (root...原创 2019-09-01 10:34:47 · 608 阅读 · 0 评论 -
将二叉搜索树构建为高度平衡二叉树的方法1--拆解为有序数组,构建高度平衡二叉树
/** * 先得到值,之后重建 * * @param root * @return */ public TreeNode balanceBST(TreeNode root) { if (root == null) { return null; } List<Integer> data = new ArrayList<>(); inOrde.原创 2020-10-06 14:21:49 · 326 阅读 · 0 评论 -
数组常用算法——二分法查找模板
/** * \* Created: liuhuichao * \* Date: 2019/5/6 * \* Time: 30:06 PM * \* Description: 二分法查找的模板 * \ */public class BinarySearchDemo { /** * 关键属性: * * 二分查找的最基础和最基本的形式。 * * 查找...原创 2019-05-07 20:13:09 · 749 阅读 · 0 评论 -
常见位运算汇总(java)
最近发现了很多挺有意思的位运算,有时候位运算解决问题还是挺简单的,(建议看一下原码,反码,补码的概念再来看下面的代码)记录下常用的一些位运算: public class BitManipulationClass { /** * 逐位输出整数的每一位 * * @param num * @return */ public i...原创 2019-09-19 00:13:40 · 448 阅读 · 0 评论 -
LeetCode——5,最长回文子串
/** * \* Created: liuhuichao * \* Date: 2019/2/19 * \* Time: 5:41 PM * \* Description: 最长回文子串 * <p> * 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 * <p> * 示例 1: * <p> * 输入: "babad" * 输出: "bab" * 注意: "aba" 也是一个有效答案。 * 示例 2: *原创 2020-07-09 11:21:43 · 309 阅读 · 0 评论 -
LeetCode——215,数组中的第K个最大元素(分治法)
/** * \* Created: liuhuichao * \* Date: 2020/1/27 * \* Time: 11:32 上午 * \* Description: 数组中的第K个最大元素 * \ * 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 * <p> * 示例 1: * ...原创 2020-02-02 20:53:59 · 1166 阅读 · 0 评论 -
LeetCode——28,实现 strStr() 函数
/** * \* Created: liuhuichao * \* Date: 2019/4/23 * \* Time: 11:25 AM * \* Description: 实现 strStr() 函数 * <p> * 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如...原创 2019-04-23 15:38:45 · 467 阅读 · 0 评论 -
LeetCode——236,二叉树的最近公共祖先
/** * \* Created: liuhuichao * \* Date: 2019/8/27 * \* Time: 27:30 PM * \* Description: 二叉树的最近公共祖先 * \ * 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 * <p> * 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为...原创 2019-08-31 12:18:54 · 341 阅读 · 0 评论 -
LeetCode——297,二叉树的序列化与反序列化
/** * \* Created: liuhuichao * \* Date: 2019/8/27 * \* Time: 28:23 PM * \* Description: 二叉树的序列化与反序列化 * \ * 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。...原创 2019-08-31 12:20:02 · 389 阅读 · 0 评论 -
LeetCode——703,数据流中的第K大元素
/** * \* Created: liuhuichao * \* Date: 2019/8/29 * \* Time: 35:22 AM * \* Description: 数据流中的第K大元素 * \ * 设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 * <p> * 你的 KthLargest ...原创 2019-09-01 10:36:42 · 537 阅读 · 0 评论 -
LeetCode——110,判断平衡二叉树
/** * \* Created: liuhuichao * \* Date: 2019/8/29 * \* Time: 30:09 PM * \* Description: 判断平衡二叉树 * \ * 给定一个二叉树,判断它是否是高度平衡的二叉树。 * <p> * 本题中,一棵高度平衡二叉树定义为: * <p> * 一个二叉树每个节点 的左右...原创 2019-09-01 10:39:28 · 965 阅读 · 0 评论 -
LeetCode——108,将有序数组转换为二叉搜索树
/** * \* Created: liuhuichao * \* Date: 2019/8/29 * \* Time: 32:32 PM * \* Description: 将有序数组转换为二叉搜索树 * \ * 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 * <p> * 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对...原创 2019-09-01 10:40:39 · 397 阅读 · 0 评论 -
LeetCode——101,对称二叉树
/** * \* Created: liuhuichao * \* Date: 2019/8/22 * \* Time: 35:53 AM * \* Description: 对称二叉树 * 给定一个二叉树,检查它是否是镜像对称的。 * <p> * 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 * <p> * 1 * / \ * ...原创 2019-08-31 12:13:46 · 432 阅读 · 0 评论 -
LeetCode——104,二叉树的最大深度
/** * \* Created: liuhuichao * \* Date: 2019/8/22 * \* Time: 35:25 AM * \* Description: 二叉树的最大深度 * \ * 给定一个二叉树,找出其最大深度。 * <p> * 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 * <p> * 说明: 叶子节...原创 2019-08-31 12:12:22 · 276 阅读 · 1 评论 -
Leetcode—— 104,二叉树的最大深度
/** * \* Created: liuhuichao * \* Date: 2019/8/22 * \* Time: 35:25 AM * \* Description: 二叉树的最大深度 * \ * 给定一个二叉树,找出其最大深度。 * <p> * 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 * <p> * 说明: 叶子节...原创 2019-08-22 22:51:29 · 269 阅读 · 0 评论