数据结构
枕上~诗书闲
这个作者很懒,什么都没留下…
展开
-
单调栈-解决临近位置的数在哪问题
单调栈一种特别设计的栈结构,为了解决如下的问题:给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息1)arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪?2)arr[i]的右侧离i最近并且小于(或者大于)arr[i]的数在哪? // arr = [ 3, 1, 2, 3] // 0 1 2 3 // [ // 0 : [-1, 1] // 1 : [-1, -1] // 2 : [ 1, -1] //原创 2021-11-29 18:56:17 · 111 阅读 · 0 评论 -
算法-并查集-岛屿问题
这道题是LeetCode原题https://leetcode.com/problems/number-of-islands/题意:给定一个二维数组表,只可能会有0和1的位置,求上下左右都为1的一个整块数量。像下图就为2个岛数量递归方式public static int numIslands(char[][] board) { int islands = 0; for (int i = 0; i < board.length; i++) { for (int j = 0原创 2021-11-26 16:01:09 · 309 阅读 · 0 评论 -
贪心算法-做项目获得的最大钱数
题意:输入: 正数数组costs、正数数组profits、正数K、正数Mcosts[i]表示i号项目的花费profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润)K表示你只能串行的最多做k个项目M表示你初始的资金说明: 每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。输出:你最后获得的最大钱数。 // 最多K个项目 // W是初始资金 // Profits[]利润 Capital[]花费 一定等长 // 返回最终最大的资金 // 串行的进行,不能原创 2021-11-25 16:53:39 · 262 阅读 · 0 评论 -
二叉树中最大的二叉搜索子树的大小
二叉树中最大的二叉搜索子树的大小给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点分析可能性:与X头无关:X左树最大可能性X右树最大可能性与X头有关:以X为头,整体全是BST搜索二叉树,X左为BST和X右为BSTX左树的最大值和X右树的最小值X左树的最大Size和X右树的最大Size判断二叉树是不是搜索二叉树原则:X左树是BST (BST搜索二叉树)X右树是BSTX左树最大伯max < XX右树景小值min > X原创 2021-11-24 16:00:00 · 129 阅读 · 0 评论 -
二叉树-中序遍历-面试技巧题
题目:拿出纸和笔,纸条。将纸张对折,会有凹下去和凸起来的对折线印记。将凹下去和凸起来的顺序打印出来 public static void f(int i, int N, boolean down) { // 超过层数就直接返回 if (i > N) { return; } f(i + 1, N, true); // 凹下去的其实就是左子树,凸起来的其实就是右子树 // 打印这颗数 System.out.print(down ? "凹 " : "凸 ");原创 2021-11-23 16:17:48 · 210 阅读 · 0 评论 -
最长回文子序列问题-动态规划-范围尝试模型
最长回文子序列问题题目:给定一个字符串str,返回这个字符串的最长回文子序列长度比如 : str = “12a343b2a1”最长回文子序列是“1234321”,返回长度7。aba也是回文,只不过不是最长回文子序列这里说明一下:子序列是可以不连续的,而子串是必须连续的,回文是正反过来练都一样先考虑一个字符的情况public static int f(char[] str, int L, int R) { if (L == R) { return 1; } i原创 2021-11-03 22:36:36 · 163 阅读 · 0 评论 -
最长公共子序列问题-动态规划-样本对应模型
最长公共子序列问题题目:两个字符串的最长公共子序列问题(样本做行,样本做列)给定两个字符串str1和str2,返回这两个字符串的最长公共子序列长度比如 : str1 = “ab123c45d6ef”,str2 = “ks1234tz56”最长公共子序列是“123456”,所以返回长度6public static int longestCommonSubsequence1(String s1, String s2) { if (s1 == null || s2 == null || s1.le原创 2021-11-02 23:04:48 · 328 阅读 · 0 评论 -
每日一题:字符串系列---输出:abbccd。 abbccd“压缩后为“a1b2c2d1“,比原字符串长度更长
输出:abbccd。 abbccd"压缩后为"a1b2c2d1",比原字符串长度更长public class Test2 { public static void main(String[] args) { System.out.println(compressString("aabcccccaaa"));//输出:a2b1c5a3 System.out.println(compressString("abbccd")); //输出:abbccd。 abbccd原创 2021-03-19 17:47:23 · 283 阅读 · 0 评论 -
每日一题:字符串系列---判断一个字符串是否是对称字符串 * 例如“abc“不是对称字符串,“aba“、“abba“、“aaa“、“mnanm“是对称字符串
判断一个字符串是否是对称字符串 * 例如"abc"不是对称字符串,“aba”、“abba”、“aaa”、"mnanm"是对称字符串public class Test{ public static void main(String[] args) { System.out.println(isPalindrome(""));//false System.out.println(isPalindrome("a"));//true System.out.p原创 2021-03-19 17:36:07 · 808 阅读 · 0 评论 -
二叉树的前序、中序、后序
一、概念二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。二、特点A:根节点、B:左节点、C:右节点;前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC (先左后根最后右);后序顺序是BCA(先左后右最后根)。三、图四、代码实现第一步: 节点实体类package node.tree;public class Node { private String value; private Node left; private原创 2021-01-23 10:32:35 · 20670 阅读 · 1 评论 -
HashMap深度分析详解
1.HashMap的实现原理?HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体。只是在JDK1.8中,链表长度大于8的时候,链表会转成红黑树!1.1 为什么用数组+链表?数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到链表是用...原创 2020-03-14 16:02:35 · 639 阅读 · 0 评论 -
常见的排序算法_下篇
sdf原创 2020-03-13 22:24:51 · 106 阅读 · 0 评论 -
常见的排序算法_上篇
排序算法分类常见排序算法可以分为两大类:比较类排序和非比较类排序;比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。时间、空间复杂程度速查表时间、空间复杂程度图比较公式: ...原创 2020-03-12 09:13:22 · 176 阅读 · 0 评论 -
广度优先搜索(BFS)和深度优先搜索(DFS)
本文介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种:深度优先搜索和广度优先搜索。广度优先搜索(简称“广搜”或BFS)广度优先搜索是一种对图进行搜索的算法。如果不太了解图,可以看看图这篇文章假设我们一开始位于某个顶点(即起点),此 时并不知道图的整体结构,而我们的目的是从起点开始顺着边搜索,直到到达指定顶点(即终点)。在此过程中每走到一个顶点,就会判断一次它是否为终点。广度优先搜索会...原创 2020-03-11 23:12:05 · 776 阅读 · 0 评论 -
原码、反码、补码计算
https://blog.csdn.net/u010841296/article/details/52850307原创 2020-03-11 16:01:14 · 2093 阅读 · 0 评论 -
图
那既然是对图的一种搜索,那什么是图呢?图它的特点有4个边、顶点、权重、方向。原创 2020-03-11 15:16:51 · 170 阅读 · 0 评论 -
位运算
前言:程序中的所有数在计算机内存中都是以二进制的形式储存的。所以一些底层代码的操作也是有位运算的身影;对于机器而言,它们只认识0和1,因为这样更加容易理解和执行,速度也会更快。通过学习也有助于程序员理解底层操作,优化自己的代码,也可以从多个角度,多个思路来解决问题。位运算: 用于对整数类型变量的二进制形式进行操作。位逻辑运算符:& (位 “与”) and^ (位 “...原创 2020-03-11 07:23:20 · 244 阅读 · 0 评论 -
二叉树
简单地来说,满足以下两个条件的树就是二叉树:本身是有序树;树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;二叉树的性质二叉树具有以下几个性质:二叉树中,第 i 层最多有 2i-1 个结点。如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。性质 3 的计...原创 2020-03-07 22:24:20 · 314 阅读 · 0 评论 -
堆
堆是一种图的树形结构其实就是把线型的存储方式装换为树型的存储方式。我们平常看到的都是以线型方式来存在的,就像下图这样子那么树的存储结构就从线型变成了树状结构。树的结构是一种非线型存储结构,存储的是具有“一对多”关系的数据元素的集合。树的节点结点:使用树结构存储的每一个数据元素都被称为“结点”。父节点:像上图中6、5的父节点就是7。子节点:那么7的子节点就是5、6。根节...原创 2020-03-05 22:52:54 · 160 阅读 · 0 评论 -
链表
链表是什么概念:链表是一种物理存储结构上非连续,无顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。指针上图中next就是指的指针。在链表中,数据都是没有顺序的,都是靠指针来指向它的下一个数据的内存地址。由于数据是分散存储的,如果想要访问数据,只能从第1个数据开始,所以遍历的速度会慢,但是添加和删除会快。注意:删除和修改只是动了指针的位置,但是元素的本身还是会...原创 2020-03-04 22:53:48 · 134 阅读 · 0 评论 -
队列
队列是什么队列:队列是一种先进先出 (fisrt in first out,FIFO)的结构。原创 2020-03-04 17:07:07 · 264 阅读 · 0 评论 -
栈
栈是什么栈:栈是一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。特点:后进先出(LIFO-last in first out):最后插入的元素最先出来。我们可以自己来写一个Stack栈的类方法功能push将元素放到栈顶(入栈)pop删除该元素(出栈)peek返回栈的边界,也就是下标isEmpty让该元素变成空import ...原创 2020-03-04 15:34:15 · 176 阅读 · 0 评论 -
算法时间复杂度和空间复杂度
算法 即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。算法VS程序很多人误以为程序就是算法,其实不然:算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来的可以运...原创 2020-03-04 14:45:08 · 299 阅读 · 0 评论 -
数据结构是什么
数据结构,直白地理解,就是研究数据的存储方式。我们都知道,数据存储只有一个目的,即为了方便后期对数据的再利用。那怎么利用才最高效,最有用呢?那肯定是要有规律的存储数据,让数据变得有规律,有序的,这样才是数据结构的核心。数据结构大致包含以下几种存储结构:线形结构,可细分为数组、栈和队列、链表;树结构,包括普通树,二叉树等;图存储结构;线形结构线形结构其实就是由很多的点组成为...原创 2020-03-04 12:45:53 · 319 阅读 · 0 评论