数据结构与算法
itcats_cn
学习技术,分享技术
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【笔试算法】小和问题
小和问题:在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组 的小和。例子:[1,3,4,2,5]1左边比1小的数,没有;3左边比3小的数,1;4左边比4小的数,1、3;2左边比2小的数,1;5左边比5小的数,1、3、4、2;所以小和为1+1+3+1+1+3+4+2=16 代码:package cn.itcats.rec...原创 2018-08-04 01:08:48 · 746 阅读 · 0 评论 -
数据结构——队列Queue(数组队列、循环队列、基于链表实现队列)
什么是队列?队列是一种线性的数据结构【线性数据结构:数组、栈、队列】相比数组,队列对应的数据操作是数组的子集。只能从一端(队尾)添加元素,只能从另一端(队首)取出元素。 数组队列代码实现Array数组类package cn.itcats.queue;public class Array<E> { private E[] data; ...原创 2018-09-29 20:45:06 · 3102 阅读 · 0 评论 -
数据结构——【链表】
最基础的动态数据结构:链表Java中线性数据结构包括:数组、栈、队列【这三者底层都是基于动态数组实现的,实现动态的机制依靠resize()动态扩容】、链表【真正的动态数据结构】。 链表可以分为单向链表和双向链表。链表中的数据都存储在Node节点中,链表与链表之间的连接依靠next指针Class Node{ //存放数据 E e; //指向当前节点的下一个节...原创 2018-11-01 11:26:19 · 292 阅读 · 0 评论 -
数据结构——Trie 字典树 前缀树
一、什么是TrieTrie不同于二分搜索树、堆、线段树等二叉树结构,Trie是一个多叉树。使用场景:通讯录高效搜索,专为处理字符串设计的。 比如字典中有n条数据,如果使用树结构,查询的时间复杂度是O(logn),如果有100万条数据的话,logn大约是20,如果有1亿条数据的话,logn大约是30(参考2的N次方计算器)如果使用Trie这种数据结构,查询每条数据的时间复杂度和字典中...原创 2018-10-28 20:50:20 · 908 阅读 · 0 评论 -
数据结构——并查集Union Find
一、并查集解决了什么问题?1、网络中节点间的连接状态:这里的网络是一个抽象的概念,指的是用户之间形成的网络2、两个或两个以上集合之间的交集 二、对并查集的设计对于一组数据,主要支持两个操作public interface UnionFind { //int getSize(); boolean isConnected(int p , int q); ...原创 2018-10-29 12:59:00 · 755 阅读 · 0 评论 -
数据结构——优先队列与堆
什么是优先队列?普通队列:先进先出,后进后出优先队列:出队顺序和入队顺序无关;和优先级相关,如医院中,病重先安排病床 优先队列的现实例子:①cpu任务调度,动态选择优先级最高的任务执行②王者荣耀中,攻击键优先打敌人,无敌人时候优先打最近的小兵 关于优先队列的实现:普通的线性结构和堆都可以作为优先队列的底层实现。堆实现优先队列,在最坏的情况下,入队与出队的操作...原创 2018-10-26 21:07:21 · 821 阅读 · 0 评论 -
数据结构——平衡树之AVL树(自平衡维护)
一、什么是AVL树及AVL树解决了什么问题?二分搜索树的不足:如果我们以此添加1、2、3、4、5元素构建一个二分搜索树,那么最终会退化成一个链表。AVL是最早的可以自平衡的二分搜索树结构,平衡二叉树即:对于任意一个节点,左子树和右子树的高度差不能超过1。 平衡二叉树的高度和节点数量之间的关系也是O(logn)将二分搜索树变为平衡二叉树:在二分搜...原创 2018-10-30 13:54:17 · 1642 阅读 · 0 评论 -
数据结构——线段树(区间树)
一、为什么要使用线段树?线段树又称为区间树,Segment Tree,对于有一类的问题,我们关心的是线段(或者区间),有一个非常经典的例子:区间染色问题1:有一面墙,长度为n,每次选择一段墙进行染色,n次操作后,我们可以在[i,j]区间内看见多少种颜色?实际上这道题可以拆分为两个步骤:①染色操作(更新区间)②查询操作(查询区间)如果都使用数组实现的话,染色和查询操作时间复杂...原创 2018-10-27 19:24:26 · 9621 阅读 · 0 评论 -
数据结构——平衡树之红黑树
一、2-3树在了解什么是红黑树之前,首先需要补充一下什么是2-3树,因为它有助于我们对红黑树的理解,包括对B类树的理解。2-3树可以有两个孩子或三个孩子,所以也就被称为2-3树,且2-3满足二分搜索树的基本性质。如左图中,a的左孩子值 < a,a右孩子的值 > a,在右图中可以存放两个元素b、c,该树有三个孩子,左孩子的值 < b,b < 中间孩子的值 <...原创 2018-10-31 00:03:06 · 844 阅读 · 0 评论 -
数据结构——哈希表
一、从一道Leetcode题目认识哈希表387.字符串中的第一个唯一字符因为该字符串只包含小写字母,即只存在a-z 26个小写字母,我们将其a-z对应到数组0-25索引的位置,出现一次,index+1代码编写:class Solution { public int firstUniqChar(String s) { int[] freq = new...原创 2019-04-12 18:06:14 · 383 阅读 · 0 评论 -
算法——转圈打印矩阵【高频考点】
【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。例如:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10public class PrintMatrix { public void printMatrix(int[][] matrix){ /...原创 2018-11-06 13:50:34 · 416 阅读 · 0 评论 -
算法——旋转正方形矩阵
【题目】 给定一个整型正方形矩阵matrix,请把该矩阵调整成 顺时针旋转90度的样子。【要求】 额外空间复杂度为O(1)。1 2 3 7 4 1 4 5 6 -------> 8 5 27 8 9 9 6 3 思路:...原创 2018-11-06 17:47:59 · 1332 阅读 · 0 评论 -
图解反转单向链表【转载】
我总觉的反转链表的过程不是那么好理解,花了点时间画图来帮助理解。1、保存当前头节点的下一个节点(当前头节点为2,先将节点3 保存起来)2、将当前头节点的下一个节点指向 “上一个节点”(当前头节点2 指向了 (“上一个节点”)节点1),这一步才是实现反转3、将当前头节点设置 “上一个节点”(将节点2 设为“上一个节点”)4、将保存的下一个节点设置 “头节点”(将节点3 设为“头节点”)转载 2018-11-06 19:38:13 · 262 阅读 · 0 评论 -
数据结构——栈【基于数组实现和链表实现】
栈Stack:栈和数组一样,也是一种线性结构,相比数组,栈对用的操作是数组的子集,只能从一端添加元素,从同一端取出元素,这一端为栈顶,栈是一种后进后出的数据结构,Last in First Out (LIFO) 栈的应用:①undo(撤销)---编辑器 ②系统调用栈(递归)---操作系统 ③括号匹配---编译器 栈的实现:public int...原创 2018-09-28 21:41:55 · 675 阅读 · 0 评论 -
数据结构——使用Java栈实现【括号匹配】
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。参考leetcode.com或leetcode-cn.com 第20题 有效的括号地址:https://leetcode-cn.com/problems/valid...原创 2018-09-28 21:14:32 · 6288 阅读 · 0 评论 -
数据结构——Java中的数组
Java中定义数组的几种方式 //Java中定义数组的几种方式 int [] arr1 = new int [10]; int [] arr2 = new int []{1,2,3,4}; int [] arr3 = {1,2,3};数组可以通过下标(索引)快速定位,索引可以富含语义,也可以没有语义,如:1、含语义:班上有30个同...原创 2018-09-28 00:36:57 · 324 阅读 · 0 评论 -
Java算法之荷兰国旗问题【手绘图解】
给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。要求额外空间复杂度O(1),时间复杂度O(N)。package cn.itcats.test;import org.junit.Test;/***荷兰国旗问题,使用的是两个指针划分两个区域 less 和 more 指针*/public cla...原创 2018-08-04 16:39:54 · 885 阅读 · 0 评论 -
Java大根堆创建和重建及堆排序
什么是大根堆?数据结构中堆结构【完全二叉树】实际通过数组实现,关于《数据结构模型——优先队列与堆》。堆又分为大根堆和小根堆,大根堆:在完全二叉树中,任何一个子树的最大值都为该子树的父节点。 小根堆:在完全二叉树中,任何一个子树的最小值都为该子树的父节点。大根堆的创建与堆排序堆结构在Java中十分重要,堆的创建的排序也尤为重要,因为向大根堆中插入一个数据,时间复杂度仅为O(logN) (即二叉树的深度,大根堆实为完全二叉树模型)。而大根堆的创...原创 2018-08-04 23:22:22 · 2916 阅读 · 0 评论 -
Java算法之经典快速排序和随机快速排序
经典快排代码: package cn.itcats.sort;import org.junit.Test;/** * (<R =R >R)归类快速排序,每次取数组最后一个数进行比较归类 * @author fatah */public class QuickSort { public void quickSort(int arr[]) { if(arr ...原创 2018-08-04 18:52:37 · 3369 阅读 · 0 评论 -
Java工程中的综合排序算法选取
1、若你需要排序的是基本数据类型,则选择快速排序。若你需要排序的是引用数据类型,则选择归并排序。(基于稳定性考虑)因为基本数据类型之间无差异,不需要考虑排序算法稳定性,而归并排序则可以实现算法的稳定性。 2、当你需要排序的样本数量小于60,直接选择插入排序,虽然插入排序的时间复杂度为O(N²),我们是忽略常数项得出来的O(N²),但在魔数60以内,插入排序的时间复杂度为O(N²)的劣势...原创 2018-08-05 11:20:14 · 1783 阅读 · 0 评论 -
java用桶思想比较相邻元素最大差值【高频考点】
题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。 什么是非基于比较的排序?如桶排序、计数排序、基数排序等1、非基于比较的排序,与被排序的样本的实际数据状况很有关系,实际中并不经常使用2、时间复杂度O(N),额外空间复杂度O(N)3、稳定的排序 核心思想:上一个(含值)桶的最大值和下一个(含值)桶的最小...原创 2018-08-05 14:38:05 · 1287 阅读 · 0 评论 -
使用Java数组结构实现大小固定的队列和栈【高频考点】
一、固定大小数组实现栈实现栈中的push(压栈)、pop(弹栈)、peek(返回栈顶第一个元素)。若压栈时将超过数组的最大容量,抛出异常信息,若弹栈时index = -1,同样抛出异常信息。核心思想:使用index作为指针,当进行压栈时候,判断index和arrSize的关系,且执行完压栈操作,index++,index指到元素下一个索引位置。当进行弹栈时候,同样判断index和arrSi...原创 2018-08-05 16:34:47 · 1202 阅读 · 0 评论 -
Java算法之设计栈并返回栈中最小元素【高频考点】
问题:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。【要求】 1.pop、push、getMin操作的时间复杂度都是O(1)。 2.设计的栈类型可以使用现成的栈结构。 思路: 具体代码实现:package cn.itcats.array;import java.util.Stack;/** * 实现一个特殊的栈,在实现栈的基...原创 2018-08-05 18:19:35 · 687 阅读 · 0 评论 -
Java仅用队列结构实现栈结构和仅用栈结构实现队列结构【高频考点】
问题:1、如何仅用队列结构实现栈结构?2、如何仅用栈结构实现队列结构? 实现思路:1、使用两个队列结构Queue1和Queue2 ,push操作一样,添加push()到Queue1,pop()核心是把 Queue1 除最后添加的元素"剪切"到 Queue2 ,最后poll()剩下的第一个元素,即为最后添加的元素,最后 再交换Queue1和Queue2和引用。如: ...原创 2018-08-05 20:10:22 · 475 阅读 · 0 评论 -
【最易懂的代码】Java冒泡排序、选择排序、插入排序、归并排序
一、冒泡排序:两个相邻元素之间,两两进行相互比较,若前一个数比后一个数大,则交换位置。每经过一次循环,则都把较大的一个数放在后面。代码实现:/**Java排序之 冒泡排序*/public class BubbleSort { public void bubbleSort(int [] arr) { //如果arr没有元素或只有一个元素 if(arr == null || ar...原创 2018-08-03 11:33:55 · 317 阅读 · 0 评论 -
Java对数器的使用
0、有一个你想要测的方法A1、实现一个绝对正确但是复杂度不好的方法B2、实现一个随机样本产生器 3、实现比对的方法4、把方法a和方法b比对很多次来验证方法a是否正确 5、如果有一个样本使得比对出错,打印样本分析是哪个方法出错6、当样本数量很多时比对测试依然正确,可以确定方法a已经正确。 数组排序对数期import java.util.Arrays;/*...原创 2018-08-03 16:05:09 · 1804 阅读 · 3 评论 -
数据结构——树结构【二叉树与二分搜索树】
关于树的一些概念节点的度结点拥有的子树数称为结点的度。度为0的结点称为叶子结点或终端结点,度不为0的结点称为非终端结点或分支结点。除根结点以外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。层次与深度 有序与无序树 树林 二叉树在我们初学JavaSE时候肯定写过这么一个程序:猜100以内的整数,注意猜的次数不能超过...原创 2018-11-01 11:26:08 · 435 阅读 · 0 评论 -
算法——之”字形打印矩阵
【题目】给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵, 例如:1,2,3,4,5,6,7,8,9,10,11,12 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12【要求】 额外空间复杂度为O(1)。 思路:使用宏观思想,千万不要把思路限制在局部。①设...原创 2018-11-06 23:00:27 · 2421 阅读 · 0 评论
分享