06 2021 档案
摘要:LeetCode39.组合总和 题目描述 /** * 给定一个无重复元素的数组 candidates 和一个目标数 target , * 找出 candidates 中所有可以使数字和为 target 的组合。 * <p> * candidates 中的数字可以无限制重复被选取。 * <p> * 说
阅读全文
摘要:断点调试 介绍 断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下,进行分析找出BUG 断点调试可以帮助我们查看Java底层源代码的执行过程 常用快捷键 F7 跳入方法内
阅读全文
摘要:Object类详解 equals方法 == 是一个比较运算符,既可以判断基本数据类型,又可以判断引用数据类型 == 如果判断基本数据类型,判断的是值是否相等 == 如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一个对象 equals是Object类中的方法,只能判断引用类型 equals
阅读全文
摘要:多态 基本介绍 方法或者对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的 具体体现 方法的多态 方法重载体现多态 对象的多态 一个对象的编译类型和运行类型可以不一致 编译类型在定义对象时就确定了,不能改变 运行类型是可以变化的 编译类型看定义时 = 的左边,运行类型看 =
阅读全文
摘要:方法覆盖重写 基本介绍 简单的说:方法覆盖重写就是子类有一个方法,和父类的某个方法的名称 返回类型 参数一样,那么我们就说子类的这个方法覆盖了父类的方法 注意事项 方法重写也叫方法覆盖 子类的方法的形参列表,方法名称要和父类方法的形参列表 方法名称完全一样 子类方法的返回类型和父类方法返回类型一样,
阅读全文
摘要:super关键字 基本介绍 super代表父类的引用,用于访问父类的属性 方法 构造器 基本语法 访问父类的属性,但是不能访问父类的private属性,super.属性名 访问父类的方法,不能访问父类的private方法 super.方法名(参数列表) 访问父类的构造器:super(参数列表),只能
阅读全文
摘要:LeetCode37.解数独 题目描述 /** * 编写一个程序,通过填充空格来解决数独问题。 * <p> * 数独的解法需 遵循如下规则: * <p> * 数字 1-9 在每一行只能出现一次。 * 数字 1-9 在每一列只能出现一次。 * 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现
阅读全文
摘要:继承 基本介绍 继承可以解决代码复用,让编程更加靠近人类思维,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同 的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过声明继承父类即可 基本语法 class 子类 extends 父类{ } 子类就会自动拥有父类
阅读全文
摘要:LeetCode36. 有效的数独 题目描述 /** * 请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 , * 验证已经填入的数字是否有效即可。 * <p> * 数字 1-9 在每一行只能出现一次。 * 数字 1-9 在每一列只能出现一次。 * 数字 1-9 在每一个以粗实线分隔的 3
阅读全文
摘要:封装 面向对象的三大特征:封装 继承 多态 封装介绍 封装就是把抽象出来的数据(属性)和对数据的操作(方法)封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(方法)才能对数据进行操作 理解 隐藏实现细节 可以对数据进行验证 实现步骤 将属性进行私有化private,即不能直接修改属性
阅读全文
摘要:访问修饰符 基本介绍 Java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限 公开级别 :用public修饰,对外公开 受保护级别:用protected修饰,对子类及其同一个包中的类公开 默认级别:没有修饰符号,向同一个包的类公开 私有级别: 用private修饰,只有类本身可以
阅读全文
摘要:Java包 包的三大作用 区分相同名字的类 当类很多时,可以很好的管理类 控制访问范围 包基本语法 package com.util; 说明: package关键字 表示打包 com.util表示包名 包的本质分析 实际上就是创建不同的文件夹/目录来保存类文件 包 命名规则 只能包含数字 字母 下划
阅读全文
摘要:Java集成开发环境 IDEA介绍 被认为是最好的Java开发工具 除了支持Java开发,还支持HTML CSS PHP MySql 等等 Eclipse介绍 Eclipse是一个开放源码的,基于Java的可扩展开发平台 目前比较优秀开发IDE之一 IDEA常用快捷键 删除当前行,默认为 ctrl
阅读全文
摘要:leetCode29. 两数相除 题目描述 /** * 给定两个整数,被除数 dividend 和除数 divisor。 * 将两数相除,要求不使用乘法、除法和 mod 运算符。 * <p> * 返回被除数 dividend 除以除数 divisor 得到的商。 * <p> * 整数除法的结果应当截
阅读全文
摘要:LeetCode22.括号生成 题目描述 /** * * 数字 n 代表生成括号的对数,请你设计一个函数, * 用于能够生成所有可能的并且 有效的 括号组合。 * */ 思路分析 生成括号,可以 使用深度优先+剪枝的方式,将有效的组合保存到集合中,将无效的组合剪枝 编写一个深度优先的递归函数,实现不
阅读全文
摘要:内部类 如果定义类在局部位置(方法中 代码块):局部内部类 匿名内部类 定义在成员位置 成员内部类 静态内部类 基本介绍 一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类,嵌套其他类的类称为外部类,是我们类的第五大成员 类的五大成员是那些 属性 方法 构造器 代码块 内部类 内部类最大的
阅读全文
摘要:接口 基本介绍 接口就是给出一些没有实现的方法,封装到一起,到某个类需要使用的时候,再根据具体情况把这些方法写出来 语法 interface 接口名{ 属性 抽象方法 } class 类名 implementd 接口{ 自己属性; 自己方法; 必须实现接口的抽象方法 } 接口是更加抽象的抽象的类,抽
阅读全文
摘要:模板模式 基本介绍 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展,改造,但子类总体上会保留抽象类的行为方式 说明 当功能内部一部分实现是确定的,一部分实现是不确定的,这时可以把不确定的部分暴露出去,让子类实现 编写一个抽象父类,父类提供多个子类通用方
阅读全文
摘要:抽象类 说明 当父类的一些方法不确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract来修饰该类就是抽象类 所谓抽象方法就是没有实现的方法 所谓没有实现就是指没法方法体 当一个类中存在抽象方法时,需要将该类声明为抽象类 一般来说,抽象类会被继承,由其子类实现程序方
阅读全文
摘要:final关键字 基本介绍 final可以修饰类 程序 方法 和 局部变量 在某些情况下,如果有下列需求,就会使用final 当不希望类被继承时,可以用final修饰 当不希望父类的某个方法被子类覆盖重写时,可以用final关键字修饰 当不希望类的某个属性值被修改,可以用final修饰 当不希望某个
阅读全文
摘要:单例设计模式 什么是设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式,设计模式就像是经典的棋谱,不同的棋局,用不同的棋谱,免去再摸索和思考 什么是单例模式 所谓类的单例设计模式,就是采用一定的方法保证在这个软件系统中,对某个类只能存在一个对象实例,并
阅读全文
摘要:LeetCode8. 字符串转换整数 (atoi) 题目描述 /** * 请你来实现一个 myAtoi(string s) 函数, * 使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。 * <p> * 函数 myAtoi(string s) 的算法如下: *
阅读全文
摘要:代码块 基本介绍 代码块又称初始化块,属于类中的成员(即是类的一部分)类似于方法,将逻辑语句封装在方法体中,通过包围起来 但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用 基本语法 修饰符{ 代码 }; 注意 修饰符可选,要写
阅读全文
摘要:深入理解main方法 说明 main方法是虚拟机调用 Java虚拟机需要调用类的main方法,所以该方法的访问权限必须是public Java虚拟机在执行main方法时不必创建对象,所以该方法必须是static 该方法接收String类型的数组参数,该数组中保存执行Java命令时传递给运行类的参数
阅读全文
摘要:类变量和类方法 说明 类变量,即静态变量,会被同一个类的所有实例对象共享 static变量,在类加载的时候就生成了 类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问 类变量的访问必须遵守相关的访问权限 类变量 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象
阅读全文
摘要:LeetCode99. 恢复二叉搜索树 题目描述 /** * * 给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。 * 请在不改变其结构的情况下,恢复这棵树。 * <p> * 进阶:使用 O(n) 空间复杂度的解法很容易实现。 * 你能想出一个只使用常数空间的解决方案吗? * */
阅读全文
摘要:注解 说明 注解也被称为元数据,用于修饰解释包,类,方法,属性,构造器,局部变量等数据信息 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等等,在JavaEE中注解占据了更重要的角色,例如用
阅读全文
摘要:枚举 简单介绍 枚举对应英文enum, 是一组常量的集合 枚举属于一种特殊的类,里面只包含一组有限的特定的对象 实现方式 自定义类实现枚举 使用enum关键字实现枚举 自定义类实现枚举 不需要提供setter方法,因为枚举对象值通常为只读 对枚举对象/属性使用final + static共同修饰,实
阅读全文
摘要:LeetCode98. 验证二叉搜索树 题目描述 /** * 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 * <p> * 假设一个二叉搜索树具有如下特征: * <p> * 节点的左子树只包含小于当前节点的数。 * 节点的右子树只包含大于当前节点的数。 * 所有左子树和右子树自身必须也是二叉搜
阅读全文
摘要:自定义异常 基本概念 当程序中出现了某些错误,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息 自定义异常步骤 定义类:自定义异常类名继承Exception或RuntimeException 如果继承Exception,属于编译异常 如果继承Run
阅读全文
摘要:异常处理 基本介绍 异常处理就是当异常发生时,对异常处理的方式 异常处理的方式 try - catch - finally 在代码中捕获的异常自行处理 throws 将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM try - catch异常处理 说明 Java提供try和cat
阅读全文
摘要:LeetCode97. 交错字符串 题目描述 /** * * 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 * s1 和 s2 交错 组成的。 * <p> * 两个字符串 s 和 t 交错 的定义与过程如下, * 其中每个字符串都会被分割成若干 非空 子字符串: * <p> * s
阅读全文
摘要:Java异常介绍 基本概念 Java语言中,将程序执行中发生的不正常情况称为异常 开发过程中的语法和逻辑错误不是异常 执行过程中所发生的异常事件可以分为两大类 Error(错误):Java虚拟机无法解决的严重问题,如JVM系统内部错误,资源耗尽等严重情况,如栈溢出StackOverflowError
阅读全文
摘要:LeetCode96. 不同的二叉搜索树 题目描述 /** * * 给你一个整数 n , * 求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种? * 返回满足题意的二叉搜索树的种数。 * */ 思路分析 对于数组中按照升序排列的元素,用这个数组组成一颗二叉搜索树,那么二
阅读全文
摘要:LeetCode94. 二叉树的中序遍历 题目描述 /** * * 给定一个二叉树的根节点 root ,返回它的 中序 遍历。 * */ 思路分析 二叉树的遍历方式有三种,即前序中序和后序,三者的不同在于根节点的遍历顺序 如果先遍历根节点,再遍历左子树然后遍历右子树则为前序遍历 如果先遍历左子树,再
阅读全文
摘要:马踏棋盘算法详解 说明 马踏棋盘是指在一个8 * 8的国际棋盘上,从某一位置开始,每次走一个日字,将所有的位置都走一遍 可以使用递归 + 回溯来解决,再加上贪心算法来优化 指定某种策略,因为从棋盘的某一位置开始走,它的下一步最多有8个选择,编写一个方法,将下一步能走的位置记录在集合中 创建一个Boo
阅读全文
摘要:弗洛伊德算法详解 说明 弗洛伊德算法也是求一个顶点到其他顶点的最短路径问题,和迪杰斯特拉算法有共同之处,不同处在于迪杰斯特拉算法只是求得某一具体的顶点到其他顶点的最短距离,而弗洛伊德会求出所有的顶点到其他顶点的距离,弗洛伊德会创建一个二维距离数组保存各个顶点到其它顶点的距离,通过不断的更新这个二维数
阅读全文
摘要:LeetCode93. 复原 IP 地址 题目描述 /** * * 给定一个只包含数字的字符串,用以表示一个 IP 地址, * 返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。 * <p> * 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能
阅读全文
摘要:迪杰斯特拉算法详解 说明 迪杰斯特拉算法是求解带权无向图中某一顶点到其他顶点的最短路径问题 核心思想为定义一个数组保存当前顶点到其他顶点的距离,然后通过广度优先算法,即横向扫描的方式,不断比较不同走法的路径大小,将最小路径对应的权值记录在数组中 每次在更新路径时,路径权值应当包含两部分,一是路径数组
阅读全文
摘要:克鲁斯卡尔之公交车站问题详解 说明 克鲁斯卡尔算法也是解决图的最短路径问题,即给定一个带权的无向图,求其最小生成树使得各个顶点之间的距离最短 公交车站问题是指有七个公交车站,修一条通路连接这七个公交车站,使得路劲最短 可以使用带权的无向图来模拟公交车站问题,因此可以使用克鲁斯卡尔算法解决 克鲁斯拉尔
阅读全文
摘要:LeetCode92. 反转链表 II 题目描述 /** * * 给你单链表的头指针 head 和两个整数 left 和 right , * 其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点, * 返回 反转后的链表 。 * */ 思路分析 将一个链表中指
阅读全文
摘要:普利姆算法之最短路径问题详解 说明 普利姆算法是一个求最短路径的算法,即给定一个带权的无向图,求一条路径使得将这些节点连接后带权路径最短,即如何生成最小生成树 以修路问题为例,假设有7个村庄,修一条通路连接这7个村庄,但是要求路径最短 使用无向图来模拟,图的顶点为村庄,带权路径为村庄的通路,则转化为
阅读全文
摘要:贪心算法之集合覆盖问题详解 说明 贪心算法是指在对某一问题求解时,每一步都寻找最优解的一种思路 集合覆盖问题指有多个电台,每个电台都可以覆盖一定的区域,求可以覆盖所有地区的最小电台数量 使用贪心算法求得的解不一定是最优解,但是接近最优解 电台覆盖问题思路??? 先用集合记录要覆盖的所有区域,然后遍历
阅读全文
摘要:KMP算法详解 说明 KMP算法是一种字符串查找算法,能较高效的从一个长字符串中匹配到模式串,即子串 KMP算法是暴力匹配算法的升级版,主要优化了暴力匹配在每次回溯时从当前匹配字符的下一个字符开始匹配的问题,因为有些字符已经匹配过 KMP核心思想为改变每次匹配失败回溯时的下一个字符位置问题,即不是从
阅读全文
摘要:LeetCode88. 合并两个有序数组 题目说明 /** * * 给你两个有序整数数组 nums1 和 nums2, * 请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 * <p> * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 * 你可以
阅读全文
摘要:LeetCode86. 分隔链表 题目说明 /** * * 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔, * 使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 * <p> * 你应当 保留 两个分区中每个节点的初始相对位置。 * */ 思路分析 题目要求将
阅读全文
摘要:字符串暴力匹配算法详解 说明 字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串 所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对 从长字符串的第一个字符开始,判断是否和子字符串的第一个字符相等,如果相等,则在比较后面的字符 如果第一个字符就不相等,则通过指针后移依
阅读全文
摘要:动态规划之背包问题详解 说明 动态规划也是一种将复杂问题拆解为许多子问题的一种算法,与分治算法类似,只不过动态规划拆解后的子问题是互相有关联的,而分治拆解后的子问题彼此没有关联 背包问题是指有一堆物品,每个物品都有自己的价格,现有一个背包,有一定的存储容量,现要求背包能存储物品的最大价值为多少,即背
阅读全文
摘要:LeetCode82. 删除排序链表中的重复元素 II 题目说明 /** * * 存在一个按升序排列的链表,给你这个链表的头节点 head , * 请你删除链表中所有存在数字重复情况的节点, * 只保留原始链表中 没有重复出现 的数字。 * * 返回同样按升序排列的结果链表。 * */ 思路分析 删
阅读全文
摘要:LeetCode83. 删除排序链表中的重复元素 题目说明 /** * * 存在一个按升序排列的链表,给你这个链表的头节点 head , * 请你删除所有重复的元素,使每个元素 只出现一次 。 * * 返回同样按升序排列的结果链表。 * * */ 思路分析 删除链表中的重复元素,因为链表是有序的因此
阅读全文
摘要:分治 + 递归之汉诺塔问题详解 说明 分治算法,即分而治之算法,将一个复杂的问题先拆分成许多简单的类似的小模块,对这些简单的小模块进行处理过后,再将这些小模块合并到一起,实现分而治的操作 汉诺塔是指有三个塔A,B,C,A塔有n个按照顺序排放好的盘子,如何将这n个盘子移动到C塔,大盘子不能放置在小盘子
阅读全文
摘要:二分查找(非递归)详解 说明 二分查找具有很高的查找效率,但是要求要查找的数组必须是有序的,如果是无序的,在查找前必须对其进行排序,否则会出问题 二分查找采用折半查找的思路,时间复杂度为对数阶,每次都判断要查找的值和数组中间值的大小关系 如果数组中间值元素等于要查找的值,说明找到,直接返回 如果中间
阅读全文
摘要:图的广度优先遍历详解 说明 广度优先遍历,及先对图的某个指定的顶点横向扫描,输出所有与当前顶点相连的邻接顶点的信息 需要使用队列记录节点访问的顺序,先从指定顶点开始扫描,每次扫描到一个新顶点,输出新顶点的信息,然后将这个顶点设置为已访问,再将这个顶点加入队列 当 当前顶点相连的多个邻接顶点信息全部输
阅读全文
摘要:图的深度优先遍历详解 说明 深度优先遍历,即先向纵深处挖掘遍历,等这条路走不通再回溯 设置要开始遍历的第一个顶点,然后寻找该顶点的第一个邻接顶点,如果第一个邻接顶点存在,则从第一个邻接顶点又重新开始深度优先,寻找它的第一个邻接顶点,直到他们的第一个邻接顶点不存在或者第一个邻接顶点已经被访问,那么寻找
阅读全文
摘要:使用邻接矩阵表示图详解 说明 图是一种可以实现多对多的数据结构,不像链表和树,他们只能建立一对一的关系,每个节点只有前驱或者后继节点,不能实现多对多 对于图的描述可以使用邻接矩阵或者邻接表 使用邻接矩阵描述图: 创建集合保存图的顶点 创建二维数组即矩阵描述顶点与顶点之间的关系,顶点与顶点之间用权值来
阅读全文
摘要:LeetCode81. 搜索旋转排序数组 II 题目说明 /** * 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 * <p> * 在传递给函数之前,nums 在预先未知的某个下标 * k(0 <= k < nums.length)上进行了 旋转 , * 使数组变为 [n
阅读全文
摘要:多路查找树 二叉树问题分析 二叉树在加载到内存时,如果二叉树的节点比较少,没有什么问题,但是如果二叉树的节点很多,就会出现问题 在构建二叉树时,需要多次进行IO操作,海量数据存储在数据库或者文件中,节点海量,构建二叉树时速度有影响 节点海量,也会构成二叉树的高度很大,会降低操作速度 多叉树 在二叉树
阅读全文
摘要:leetCode80. 删除有序数组中的重复项 II 题目描述 /** * 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 , * 返回删除后数组的新长度。 * * 不要使用额外的数组空间,你必须在 原地 修改输入数组 * 并在使用 O(1) 额外空间的条件下
阅读全文
摘要:日期类详解 第一代日期类 Date : 精确到毫秒,代表特定的瞬间 SimpleDateFormat格式化和解析日期的具体类,它允许进行格式化(日期 →文本),解析(文本 - > 日期)和规范化 第二代日期类 主要为Calendar(日历) Calendar类是一个抽象类,它为特定瞬间与一组诸如YE
阅读全文
摘要:平衡二叉树(AVL)详解 说明 平衡二叉树又称平衡二叉排序树,是二叉排序树的一种特殊类型 平衡二叉树主要为了解决二叉搜索树出现的一些问题,比如如果二叉搜索树的各个节点的值是按照顺序的,那么二叉排序树的形式会形如单链表,但是它的查找速度会比单链表慢,因为二叉排序树在遍历时还要考虑左子树或者右子树,即使
阅读全文
摘要:LeetCode75. 颜色分类 题目说明 /** * * 给定一个包含红色、白色和蓝色,一共 n 个元素的数组, * 原地对它们进行排序,使得相同颜色的元素相邻, * 并按照红色、白色、蓝色顺序排列。 * <p> * 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 */ 思路分
阅读全文
摘要:二叉排序树删除节点详解 说明 二叉排序树有着比数组查找快,比链表增删快的优势,比较常见 二叉排序树要删除节点,首先要找到该节点和该节点对应的父节点,因为只根据当前节点是不能删除节点本身的,因此需要找到父节点 二叉排序树删除节点,根据节点所在的位置不同,需要分为三种情况 即要删除的节点是叶子节点,要删
阅读全文
摘要:LeetCode74. 搜索二维矩阵 题目描述 /** * 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: * <p> * 每行中的整数从左到右按升序排列。 * 每行的第一个整数大于前一行的最后一个整数。 */ 思路分析 由题目知,二维数组中的元素是有序的,因
阅读全文
摘要:二叉排序树创建详解 说明 二叉排序树是二叉树的一种,它的左子节点元素值总是小于父节点,右子节点值总是大于父节点 而且它各个节点之间通过引用连接,具有链表的灵活结构,因此增加和删除元素是非常快的,只需要判断当前要添加的值和叶子节点的大小关系,然后添加即可 也因为它的左右子节点值和父节点值的关系,使用二
阅读全文
摘要:赫夫曼编码之文件压缩与解压详解 说明 使用赫夫曼编码对文件进行压缩与解压,与对文本文件的操作是一样的,只是加入了IO流的相关操作 赫夫曼编码对于重复率较高的二进制文件压缩效率较高,但是如果二进制文件重复率不高,则基本没有压缩效率 注意使用赫夫曼压缩后的文件,必须使用赫夫曼再进行解压,其他解压工具不提
阅读全文
摘要:赫夫曼解码详解 说明 上篇已经说明赫夫曼编码,那么将一文件通过编码压缩后,需要再对其进行解压,就是将其还原为原来的文件 解码也就是编码的逆向操作,熟悉编码的操作流程后,解码相对简单 需要先将编码后的字符数组转成二进制字符串,具体思路及解析见方法 byteToBitString 拿到二进制字符串后,需
阅读全文
摘要:LeetCode73. 矩阵置零 题目描述 /** * 给定一个 m x n 的矩阵,如果一个元素为 0 , * 则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 * * 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 * 一个简单的改进方案是使用 O(m
阅读全文
摘要:赫夫曼编码详解 说明 赫夫曼编码是基于赫夫曼树的一种文件压缩算法,常用于文件的编码,压缩效率较高 本文主要基于赫夫曼编码说明,对于赫夫曼树见前一篇 大致思路如下: 因为任何类型的文件在计算机底层存储的时候都是以字符的形式存储的,因此文件的压缩主要是对字符的优化处理 先创建节点类,应当包含当前字符,权
阅读全文
摘要:LeetCode70.爬楼梯 题目描述 /** * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 * * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? * * 注意:给定 n 是一个正整数。 */ 思路分析 由题意可知,因为每次只能爬一个或者两个楼梯,所以n个台阶的总共爬
阅读全文
摘要:创建赫夫曼树详解 说明 赫夫曼树又称哈夫曼树,是指带权路径长度(WPL)最小的一颗二叉树 带权路径长度等于该数的所有叶子节点的权值 * 该叶子节点所在树的路径长度 创建一颗赫夫曼树,指的是将一个数组中的所有元素全部当作二叉树的叶子节点,然后计算WPL,wpl最小的二叉树,也就是最优二叉树,称为赫夫曼
阅读全文
摘要:堆排序详解 说明 堆排序基于堆的特性,速度较快,效率较高,平均时间复杂度为线性对数阶 先说明大顶堆和小顶堆 大顶堆是指当前二叉树的父节点对应的值总是大于子节点对应的值,及arr[i] >= arr[ 2 * i + 1] 并且arr[i] >= arr[ 2 * i + 2]总成立,不论是根节点还是
阅读全文
摘要:leetCode69. x 的平方根 题目描述 /** * 实现 int sqrt(int x) 函数。 * * 计算并返回 x 的平方根,其中 x 是非负整数。 * * 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 * */ 思路分析 实现开平方函数,可以使用函数替换法,即将x的二
阅读全文
摘要:二叉树线索化遍历 说明 二叉树在线索化之后,不能使用之前的前序中序后续遍历方法,因为将一些叶子节点连通后,可能出现循环递归 因此需要编写新的线索化遍历方法 以中序线索化遍历为例 先根据中序线索化后的前驱节点类型寻找中序遍历的第一个节点,它的前驱接节点类型为 1 ,找到第一个前驱节点后,依次判断当前节
阅读全文
摘要:线索化二叉树详解 说明 线索化二叉树,由字面意思,就是将二叉树的节点拿线索连接起来 实质上,也就是将二叉树的叶子节点左右指针域彼此连接一个节点 二叉树的非叶子节点的左右指针域都各自连接了一个节点,但是叶子节点的左右指针域是空的,因此考虑将叶子节点的左右指针域按照某种遍历次序连接起来 按照二叉树的遍历
阅读全文
摘要:顺序存储二叉树详解 说明 顺序存储二叉树,即将一颗完全二叉树按照从上到下,从左到右的顺序存储到一个数组中,因为数组是顺序存储的结构,因此称为顺序存储二叉树 给二叉树中各节点用 n 编号,从零开始,一直到最后 一个节点,对应于数组位置 假设当前节点的编号为 n ,那么当前节点的左子节点编号为 2 *
阅读全文
摘要:二叉树删除节点详解 说明 二叉树删除节点,如果删除的是叶子节点,则找到后直接删除,如果是非叶子节点,则删除该子树 因为没有针对某种特定的二叉树,因此没有考虑如果是非叶子节点,只删除该节点的情况 删除节点思路 先判断该二叉树是否为空,如果不为空,则判断该二叉树的根节点是不是需要删除的节点,如果是,则直
阅读全文
摘要:LeetCode67. 二进制求和 题目描述 /** * * 给你两个二进制字符串,返回它们的和(用二进制表示)。 * * 输入为 非空 字符串且只包含数字 1 和 0。 * */ 思路分析 二进制求和算法思路和十进制求和完全一致 二进制是逢2进一,而十进制是逢10进1,其他进制也类似 从最低位到最
阅读全文
摘要:二叉树前序中序后续查找详解 说明 二叉树前序中序后续查找和遍历思路完全类似,查找完全是在遍历的基础上,只不过如果找到想要查找的节点,则直接返回 前序查找是先判断要查找的节点是不是当前节点,如果是,则直接返回,如果不是,则判断当前节点的左子树是否为空,如果不为空,则递归前序查找,如果左子树查找完毕后还
阅读全文
摘要:二叉树前序中序后续遍历详解 说明 二叉树前序中序后续遍历的主要不同在于父节点的输出顺序 前序遍历是先输出父节点,然后判断左子树是否为空,如果不为空,则递归前序遍历,然后再判断右子树是否为空,如果不为空,则递归前序遍历 中序遍历实现判断当前节点的左子树是否为空,如果不为空,则递归中序遍历,然后再输出当
阅读全文
摘要:LeetCode66.加一 题目描述 /** * * 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 * <p> * 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 * <p> * 你可以假设除了整数 0 之外,这个整数不会以零开头。 * */ 思路分析 用
阅读全文
摘要:哈希表详解 哈希表说明 哈希表,又称为散列表,通过关键码值来存储数据,具有很高的查询效率 哈希表的核心思想是数组里边存储链表 哈希表一般用作数据的缓冲层,因为它的快速高效及结构特性 通过向员工系统中添加员工模拟哈希表思路分析 先创建一个员工类,实例化对象为一个实际存在的员工,类似于链表的节点 然后创
阅读全文
摘要:斐波那契查找算法详解 说明 斐波那契查找算法核心思想类似于二分查找和插值查找,区别在于对标志值,即 mid 的设计算法不一样,二分查找直接重用中间值作为标杆,插值查找使用自适应确定mid,而斐波那契查找算法则使用黄金分割,使得mid总是处于查找数列的黄金分割点位置 因为斐波那契数列越到后边,相邻两数
阅读全文
摘要:插值查找算法详解 说明 插值查找算法是二分查找算法的升级版,即优化算法,如果要查找的数组中有大量的数据,而要查找的数是第一个或者最后一个,那么二分查找也要耗费一定的时间,原因在于对Mid值的确定每次都是在中间,为了解决这个问题,对二分查找进行优化 插值查找思路与二分查找思路相同,都是使用递归的思想,
阅读全文
摘要:LeetCode61. 旋转链表 题目描述 /** * * 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 * */ 思路分析 旋转链表,也就是将链表的每个节点向右移动 k 个位置,考虑先将链表置为环形链表 先计算原始链表的长度,将链表向右移动k个节点,也就是将环形
阅读全文
摘要:二分查找之查找数组中相同的多个元素详解 思路分析 如果数组中有多个相同的元素,而正好要查找这些元素的下标,则应该以集合的形式返回 二分查找的整体思路不变,还是使用递归查找,若没有找到则返回空集合 但是当找到一个要查找的元素时,不能直接返回,而是向左或者向右扫描,判断找到的这个元素左侧或者右侧元素也是
阅读全文
摘要:二分查找详解 思路分析 二分查找是经常使用的一种查找算法,查找速度快,只需要O(log n)时间复杂度 但是二分查找要求原始数组是有序的,即要么升序,要么降序 使用递归的思路,考虑递归结束的条件,即要么找到该元素,要么查找完数组还没有找到该元素,都结束递归 源码及详解见下 源码及分析 /** * 二
阅读全文
摘要:线性查找详解 说明 线性查找是最简单的查找算法,即遍历一次数组,将要查找的元素和数组中的所有元素一一比对 如果找到该元素,则返回该元素对应的索引,否则返回-1表示没有找到 线性查找不要求数组是有序的,但是遍历数组耗时较多 一般情况下不建议使用 源码 /** * 线性查找 * 如果在数组中找到该值,则
阅读全文
摘要:基数排序详解 思路分析 基数排序是典型的以空间换时间的排序算法,但是当对大量数据进行排序时,可能会出现空间不足的情况 基数排序实质上是对桶排序的升级,核心思想是对数组中的每个元素从低位到高位开始排序,在较小数据高位补零,使数组中个元素长度相同 因此需要大量空间,即创建十个桶用来辅助排序,用二维数组来
阅读全文
摘要:LeetCode54. 螺旋矩阵 题目描述 /** * * 给你一个 m 行 n 列的矩阵 matrix , * 请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 * */ 思路分析 螺旋矩阵,即螺旋输出矩阵,即将每层按照顺时针的方式将其元素保存在集合中然后输出 定义四个变量 left right
阅读全文
摘要:leetCode59. 螺旋矩阵 II 题目描述 /** * * 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素, * 且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 * */ 思路分析 螺旋生成矩阵,可以将一个矩阵看作二维数组,也就是按照顺时针在二维数组中填充数
阅读全文
摘要:归并排序详解 说明 归并排序使用分治的思想,分治是将一个复杂的问题拆结尾简单的问题,然后使用递归的思路求解 归并实质上是将数组中的元素先二分,第一次从中间分成两部分,然后对这两部分再二分,依次进行,直到分成的每组只有一个元素,如果只有一个元素,那么就一定能保证这组元素是有序的,分解结束后,将分解后的
阅读全文
摘要:LeetCode58. 最后一个单词的长度 题目描述 /** * * 给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。 * 如果不存在最后一个单词,请返回 0 。 * * 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 * */ 思路分析 给定一个
阅读全文
摘要:快速排序详解 说明 快速排序是对冒泡排序的一种升级,因此排序速度非常快,典型的以空间换时间的思路 先从数组中找一个中间值,这个值的找法有设计者自己定义,可以是数组最中间的值,也可以是数组的最前边或者最后边的值,一般选择中间值 找到这个标志值后,将左侧大于这个标志值的数移动到这个值右侧,将右侧小于标志
阅读全文
摘要:希尔排序详解 说明 希尔排序是对插入排序的一种升级算法,补足的插入排序的缺点,即如果最小的数字在最末尾,那么插入排序就要交换元素 len - 1次才能将最小元素移动到最前边 希尔排序也称缩小增量排序,核心思想就是不断的缩小增量,第一次增量缩小为数组元素长度的一半,第二次再缩小一半,以此类推,直到增量
阅读全文
摘要:LeetCode57. 插入区间 题目描述 /** * * 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 * <p> * 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠 * <p> * (如果有必要的话,可以合并区间)。 * */ 思路分析 因为原始区间列表是无重叠的,并
阅读全文