![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
六甲横宝
这个作者很懒,什么都没留下…
展开
-
从TreeMap源码搞懂红黑树
红黑树概述在之前分析集合框架源码时笔者曾说过“红黑树的部分以后有经理再进行补充吧,左旋右旋,treefy,实在是磕不懂源码了哈哈哈”,终于狠下心从TreeMap源码仔细研究了一遍,来吧,好好分析分析红黑树这个牛逼的数据结构。TreeMap源码最开始的注释中就写到了这样的一句话:/** * A Red-Black tree based {@link NavigableMap} implementation. */也就是说 TreeMap 是由红黑树实现的,红黑树和AVL树类似,都是在进行插入和删原创 2020-12-13 14:24:45 · 200 阅读 · 0 评论 -
Java集合框架及其源码分析
文章目录1. 容器概述1.1. Java容器的引入及容器中的接口1.2. `Collection`接口中的抽象方法1.3. `Iterable`接口和`Iterator`接口1.4. `List` 接口1.5. `Set` 接口1.5. `Queue` 与 `Deque`接口1.7. `Map` 接口2. 主要的具体集合及其源码分析2.1. `ArrayList`2.1.1. jdk 7 情况下:2.1.2. jdk 8 情况下:2.2. `LinkedList`2.4. `ArrayDeque`2.4.原创 2020-11-03 13:07:09 · 384 阅读 · 0 评论 -
Morris遍历
Morris遍历概述在二叉树遍历的深度优先遍历中,分析了如何用递归和非递归方式实现遍历二叉树,但是那些方法都无法做到空间复杂度为 O(1),对于递归方法,遍历时用到了函数栈,而对于非递归方法,则是直接申请了栈,这两种方法的空间复杂度均与树的高度相关,设树的高度为 h,则空间复杂度为 O(h)。事实上对于二叉树的遍历,还有一种空间复杂度为 O(1) 的方法,这就是——Morris遍历!!!普通的递归和非递归解法在遍历过程中,在处理完某个节点后都是通过栈结构(函数栈或申请的栈)才可以返回上层去,正是二叉树原创 2020-10-22 09:34:49 · 1060 阅读 · 4 评论 -
链表的常用操作
title: 链表的常用操作date: 2020-10-19 15:17:54tags: [数据结构, 算法]单链表的定义class ListNode { int val; ListNode next; ListNode() { } ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val.原创 2020-10-21 18:21:47 · 109 阅读 · 0 评论 -
常用的排序算法
常用的排序算法首先交代下通用的交换数组中元素的函数:/** * 交换数组中两个元素 * @param nums * @param i1 索引1 * @param i2 索引2 */public void swap(int[] nums, int i1, int i2) { int temp = nums[i1]; nums[i1] = nums[i2]; nums[i2] = temp;}上面的swap函数用于将数组中索引为i1和i2 的两个元素进行交换。冒泡原创 2020-08-08 17:37:16 · 213 阅读 · 1 评论 -
数据结构之字典树的分析与实现
字典树字典树的结构Trie树,即字典树,又称单词查找树、前缀树、键树,是一种树形结构,其典型的应用是用于统计和排序大量的字符串。字典树的节点结构具有以下两个字段:最多R个指向子节点的链接Trie[] next,其中每个链接对应字母表数据集中的一个字母;我们可以假设都为小写字符,可以取R=26;一个布尔类型isEnd,用来标志当前节点是对应键的结尾(字符串的结尾)还是只是键前缀(字符串的一个前缀)。字典树具有如下的3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符;从根原创 2020-08-06 20:58:18 · 260 阅读 · 0 评论 -
剑指offer题解数据结构篇
文章目录数组篇剑指 Offer 03. 数组中重复的数字题目题解1:排序法题解2:哈希表题解3:手动维护哈希表剑指 Offer 04. 二维数组中的查找题目题解1:暴力法题解2:线性查找法字符串篇剑指 Offer 05. 替换空格题目题解链表篇剑指 Offer 06. 从尾到头打印链表题目题解二叉树篇剑指 Offer 07. 重建二叉树题目题解栈和队列篇剑指 Offer 09. 用两个栈实现队列题目题解数组篇剑指 Offer 03. 数组中重复的数字题目在一个长度为 n 的数组 nums 里的所有原创 2020-07-04 21:43:45 · 190 阅读 · 0 评论 -
二叉树遍历的深度优先遍历
二叉树的深度优先遍历力扣[144]二叉树的前序遍历题目给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]解法一:递归class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList&l原创 2020-07-02 13:46:18 · 215 阅读 · 0 评论 -
力扣[239]滑动最大窗口
题目给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7原创 2020-06-12 11:35:08 · 238 阅读 · 0 评论 -
算法-力扣[394] 字符串解码
力扣[394] 字符串解码题目给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例:s = "3[a]2[bc]", 返回 "aaabcbc".s原创 2020-05-28 11:31:13 · 337 阅读 · 0 评论 -
算法-力扣-070-爬楼梯
题目假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。分析 思想:找最近重复子问题n=1时:只有1中方法爬到第1阶。n=2时:有2方法爬到第2阶,1阶+1阶,或,2阶。n=3时:我们考虑爬到第3阶之前的那步,只可能实在第1阶或第2阶,也就是爬到第3阶的方法=第一阶的方法+2,或,=第2阶的方法+1.推广可得:爬到n的方法数f(n) = f(n-1) + f(n-2),显然本题的本质是斐波那契数列原创 2020-05-27 22:02:42 · 253 阅读 · 0 评论 -
算法-力扣-015-三数之和
题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum著作权归领扣网络所有。商原创 2020-05-27 22:01:22 · 220 阅读 · 1 评论 -
算法-力扣-011-盛最多水的容器
力扣[11]盛最多水的容器题目示例:输入:[1,8,6,2,5,4,8,3,7] 输出:49题解1 思想:暴力枚举用指针i代表左柱,用指针j代表右柱,指针i起始为0,指针j起始为1,i和j都向右走,穷举遍历每一个面积,直到找到最大的面积为止。代码如下: int max = 0; for (int i = 0; i < height.length - 1; i++) { for (int j = i + 1; j < height.length; j原创 2020-05-27 21:59:49 · 312 阅读 · 1 评论 -
算法-力扣-N叉树遍历
N叉树节点的定义public class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { val = _val; childre原创 2020-05-27 21:57:12 · 593 阅读 · 0 评论 -
力扣[242]有效的字母异位词
力扣[242]有效的字母异位体题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(构成字符串的字母种类和个数均相同,只不过顺序不同)。题解1:暴力可以将两个字符串都转化为数组,然后对两个数组先进行排序,如果排序后的数组内容相同,则两个字符串时字母异位体:public boolean isAnagram(String s, String t) { char[] schar = s.toCharArray(); char[] tchar = t.toChar原创 2020-05-26 22:47:12 · 391 阅读 · 0 评论