
数据结构
逝水一战
重剑无锋,大巧不工
展开
-
并查集及其应用
并查集介绍并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的初始化方法为先让所有的结点自成一个独立的集合,自己作为自己的簇头(是用簇头来标识集合的);若已知两个元素属于同一集合,则将这两个元素所在的集合合并。并操作:将两个元素所在的集合合并查操作:找到给定元素的簇头如下图所示就是unio(a , b)的过程,此外在为了提高并查集的查询效率,一种很容易想到的做法为让并查集尽可能的矮,因此在查询的过程中,将查到的中间结点的都连到其簇头下面。案例一:等式.原创 2020-06-08 11:20:03 · 2626 阅读 · 0 评论 -
数组中第k大的元素
问题描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-.原创 2020-06-05 16:58:53 · 286 阅读 · 0 评论 -
前缀树及其应用
前缀树又称为字典树,单词查找树。其最大的优点为利用字符串的公共前缀极大的提高字符串的查询效率。如下图所示为“apple”,“app”,“apply” “pen”组成的前缀树结构问题一:leetcod208实现前缀树问题描述:实现一个 Trie (前缀树),包含insert,search, 和startsWith这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // ...原创 2020-06-05 09:32:37 · 661 阅读 · 0 评论 -
LRU(least recently used)
LRU(least recently used),最近最久未使用置换算法是一种页面置换算法,操作系统中当内存空间不足时,会将内存中暂时不用的信息置换到外存(磁盘)中,用的时候再换进来。所谓最近最久未使用置换算法就是优先将最近未使用(最早进来)的页面置换出去。根据局部性原理,认为最近使用的页面之后再次被使用的概率最大。因此该算法是合理的。一种硬件解决方案是,对于每一个页面记录自上次访问经...原创 2020-04-05 15:37:02 · 433 阅读 · 0 评论 -
按基准划分链表(分为三段)
问题描述:给定一个链表和一个特定值x,对链表进行分隔,使得所有小于x的节点放在前面,等于x的节点放在中间,大于x的结点放在后面。该问题为leetcode86分隔链表的加强版。实现思路:1.链表分隔首先定义三个小链表,遍历该链表,将小于x值的插到第一个链表后面,等于的插到第二个链表之后,大于的插入第三个链表后面。2.小表合并将这三个链表依次首位相连连成一个大链表...原创 2019-10-14 10:51:46 · 1255 阅读 · 0 评论 -
先序中序重构二叉树
已知二叉树的先序遍历序列和中序遍历序列,重构出二叉树。算法简介:如上图所示的二叉树,其先序遍历序列为:a b d c e f 中序序列为:d b a e c f首先可以知道根结点为先序的第一个元素即 a ,(a b d c e f)再由中序序列可知对于根结点a 其中序序列的左子树为db 右子树为ecf (d b a e c f)接下来可以得到先序序列 左子树为bd 右子...原创 2019-10-11 16:53:22 · 423 阅读 · 0 评论 -
计数排序与基数排序
计数排序与计数排序的思想都来自于桶排序,桶排序的大体思想为:若N个关键字均可以映射到0-M的整数范围内,则可以建立M+1大小的桶,然后依次遍历N个关键字,依次将他们放到自己对应的那个桶里面,最后从0开始依次将桶中的元素倒出即可。计数排序:大体思想:假设序列值均为整数,首先获得序列的最大值valueMax和最小值valueMin,建立一个大小为(valueMax-valueMin+1)的数组...原创 2019-08-12 17:34:36 · 233 阅读 · 0 评论 -
归并排序(java描述)
大体思想:将长度为N的序列依次完成长度为1的有序序列,长度为2的有序序列.长度为4的有序序列...长度为N的有序序列,如下表所示:具体实现:具体是用递归方式实现的,其中递归中的关键一步为;若一个序列的左序列和右序列均已经排好序列,就将其合并。合并部分为借助一个与待合并序列长度之和的临时数组,首先利用双指针法将两个有序的子序列排好序放入临时数组中,然后将临时数组中的数据复制到原始...原创 2019-08-10 17:43:56 · 152 阅读 · 0 评论 -
快速排序
基本思想:第一步:从序列中随机挑选一个元素作为主值第二步:将序列中小于该元素的值放到其左边,大于该元素的值放到其右边自此主值元素的最终位置确定,后续只需递归进行上述操作对其的左序列及右序列(注:左,右序列均不包括该元素)具体实现:先获得主值,将取到的主值放到序列最后。左区间用于存放比主值小的元素,其初始长度为0。遍历该序列先将不大于主值的元素交换到右区间的第一个位置,再对左区间...原创 2019-08-07 16:43:20 · 157 阅读 · 0 评论 -
三种时间复杂度为O(n^2)的排序算法
1.冒泡排序基本思想:依次比较相邻元素,若前面的大于后面的就交换元素,在一次迭代中将最大的元素“沉降”到最后的位置,经过n-1次迭代即可完成排序目的。 public static void bubbleSort(int[] data) { for(int i=0;i<data.length-1;i++) { boolean Bfinis...原创 2019-08-07 16:03:52 · 4715 阅读 · 0 评论 -
堆排序
堆的概念:堆是一个完全二叉树,又分为最小堆和最大堆。最大堆指的是每个节点的值总是大于其子结点。如下图所示,就为一个最大堆(ps.图画的不好,能说明问题)。由于堆是一个完全二叉树,因此实际中一般采用数组存放。设父节点的下标为parentIndex,子结点的下标为childIndex,左孩子的下标为leftIndex,右孩子为rightIndex,满足如下的规律:parentInd...原创 2019-08-09 10:27:02 · 218 阅读 · 1 评论 -
两两交换链表中的节点(Leetcode24)
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4 你应该返回 2->1->4->3思路:很明显是一个递归问题,先将后面的N-2的结点完成,在此基础上完成第一个和第二个结点的交换。交换:第一个结点为p1,第二个为p2,p1.ne...原创 2019-05-26 15:09:04 · 170 阅读 · 0 评论 -
盛最多水的容器算法证明过程(LeetCode11)
题目:给定n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画n条垂直线,垂直线i的两个端点分别为(i,ai) 和 (i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。算法:定义两个指针i,j(其初始位置i在头,j在尾)if(ai>aj) j--;else i++.最大的面积总是在i j之间。证明...原创 2019-05-01 19:13:28 · 657 阅读 · 0 评论