Java数据结构
java数据结构
……:)
等跑到终点再回头.
展开
-
最长公共子串
最长公共子串需用动态规划求解,MCS[i][j]记录短字符串s1前i个字符和长字符串s2前j个字符的最长子串的长度,初始化所有值为0。当s1[i-1] = s2[j-1]时,MCS[i][j] = MCS[i - 1][j - 1] +1,这里使用一个额外的值start来记录最长子串在短字符串s1中出现的起始位置,maxlen记录当前最长子串的长度,当MCS[i][j]<maxlen时,maxlen = MCS[i][j],则start = i - maxlen;当s1[i-1] !=s2原创 2021-05-26 17:30:21 · 93 阅读 · 0 评论 -
Java数据结构之 Map 和 Set
Map 和 Set目录Map 和 Set一、Map二、Set三、Map与Set区别四、图解关系一、Map1. Map是什么?Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap 。例如:Map<String,String> map = new HashMap<>();2、Map原创 2021-04-22 11:48:06 · 321 阅读 · 0 评论 -
java实现简单哈希表和二叉搜索树
哈希表和搜索树一、哈希表哈希表(hash table):哈希表是基于数组取下标的方式来快速进行增删改查的一种数据结构。哈希函数:将 key 映射成数组下标的函数。哈希冲突:不同的 key ,映射到相同的下标上。处理哈希冲突的方法:①闭散列;②开散列。闭散列:1)若出现哈希冲突,则继续往后找下一个空闲位置。(可将int类型的数组换为对象数组);2) 若数组上元素较多,比较拥挤,此时算法性能严重下降,就需频繁对数组进行扩容,使得数组上保持稀疏。开散列(哈希桶):1)原创 2021-03-29 21:28:29 · 284 阅读 · 0 评论 -
前 k 个高频单词
题目描述:给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2输出: [“i”, “love”]解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。注意,按字母顺序 “i” 在 “love” 之前。链接:https://leetcode-cn.com/probl原创 2021-03-28 19:10:01 · 153 阅读 · 0 评论 -
旧键盘输出坏键
题目描述:链接:https://www.nowcoder.com/questionTerminal/f88dafac00c8431fa363cd85a37c2d5e输入描述:输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。输出描述:按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。示例:输入:原创 2021-03-28 19:02:18 · 107 阅读 · 0 评论 -
复制带随机指针的链表
题目描述:给一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么原创 2021-03-28 18:50:12 · 59 阅读 · 0 评论 -
七种排序算法
七种排序算法的实现:一、插入排序将整个区间划分为已排序区间和待排序区间,每次选择待排序区间的第一个元素,在已排序区间内选择合适位置插入。代码实现: public static void insertSort(int[] arr){ //将整个数组区间分为已排序区间和待排序区间。初始已排序区间可为第一个元素 //已排序区间 [0,1) //待排序区间 [1,arr.length) int bound = 1; //外层原创 2021-03-27 18:35:38 · 101 阅读 · 1 评论 -
从先序 / 后序和中序遍历序列构造二叉树
题目描述:根据一棵树的前序遍历与中序遍历构造二叉树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode原创 2021-03-22 19:34:34 · 304 阅读 · 0 评论 -
二叉树转双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二叉搜索树的特点:对于树上的任意节点,左子树节点小于根节点,右子树节点大于根节点。二叉搜索树中序遍历可以得到一个有序的序列。求解思路:通过中序遍历来转换递归将左子树转换成双向链表;将根节点尾插到左子树链表的末尾;递归将右子树转成链表;将根节点头插到右子树链表前面。代码实现:/**public class TreeNode { int val = 0;原创 2021-03-20 13:53:37 · 1150 阅读 · 0 评论 -
二叉树的最近公共祖先
题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q原创 2021-03-20 12:44:44 · 61 阅读 · 0 评论 -
二叉树的层序遍历
题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal求解思路:采用层序遍历,同时在递归方法的参数中加上当前节点的层数;在递归方法内部,根据层数信息,决定将此节点加入到哪个数组中。代码实现:/** * Definition for a binary tree node. * public class T原创 2021-03-20 10:48:55 · 48 阅读 · 0 评论 -
用队列实现二叉树的层序遍历
二叉树的层序遍历:设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。层序遍历结果:ABCDEFGHI实现思路:借助队列实现将根节点入队列;进行出队列操作,同时访问此节点;分别将左右子树入队列;回到步骤2,循环继续执行。(队列为空时循环结束)代码实现:import java.util.LinkedList;import jav原创 2021-03-20 10:31:59 · 2633 阅读 · 0 评论 -
二叉树创建
题目描述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。输入描述:输入包括1行字符串,长度不超过100。输出描述:可能有多组测试数据,对于每组数据,输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。每个输出结果占一行。示例:输入:abc##de#g##f###输出:c原创 2021-03-20 09:48:25 · 409 阅读 · 0 评论 -
括号匹配
问题描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。链接:https://leetcode-cn.com/problems/valid-parentheses有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”原创 2021-03-12 09:35:22 · 102 阅读 · 0 评论 -
实现栈和队列
用顺序表和链表分别实现栈和队列一、栈的实现(入栈、出栈、取栈顶元素)顺序表实现栈操作:入栈——>顺序表尾插实现出栈——>顺序表尾删实现取栈顶元素——>根据下标获取元素代码实现:public class MyStack { //用顺序表实现栈 private int[] data = new int[100]; private int size = 0; //1.入栈 public void push(int val){原创 2021-03-09 17:57:42 · 95 阅读 · 0 评论 -
相交链表
题目描述:编写一个程序,找到两个单链表相交的起始节点。链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists示例:求解思路:创建两个引用,分别指向两个链表的头节点cur1、cur2;比较两链表长度,若 l1 > l2,让 cur1 先走 l1 - l2 步;若 l2 > l1,让 cur2 先走 l2 - l1 步。使得两者处在同一起点位置处。时cur1和cur2同时以同速度往后走,判断是否相遇,相原创 2021-03-07 11:33:59 · 53 阅读 · 0 评论 -
链表的回文结构
题目描述:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true求解思路:空间复杂度O(N):逆置对比。将链表A复制一份给链表B,将链表B逆置,对比两链表是否相同。空间复杂度O(1):找到链表A的中间节点,将链表后半部分逆置,对比前后两个半链表是否相同。代码实现:1.空间复杂度为O(N)p原创 2021-03-07 11:11:42 · 96 阅读 · 0 评论 -
删除链表中重复的节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。求解思路:循环遍历链表,若当前节点是重复节点,则跳过,寻找下一个不重复节点(重复节点可能不只重复一次,需嵌套循环寻找不重复的节点);若当前节点不是重复节点,则将此节点插入到新链表的尾部。代码实现:public class Solution { public Lis原创 2021-03-07 10:31:58 · 208 阅读 · 0 评论 -
链表分割
题目描述:现有一链表头指针 ListNode * pHead ,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。求解思路:遍历链表,判断每个节点值与x的大小关系,将小于x的节点插入到新链表smallList尾部,将大于x的节点插入到新链表largeList尾部,最后将链表smallList和链表largeList首尾相连。代码实现:public class Partition { public ListNode partit原创 2021-03-07 09:53:12 · 127 阅读 · 0 评论 -
环形链表II
题目描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。链接:https://leetcode-cn.com/problems/linked-list-cycle-ii示例1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。示例2:输入:head = [1,2], pos = 0输出:返回索引为 0 的链表节点解释:链表中有一个环,其尾部连接到第一个节点。示例3:原创 2021-03-06 15:38:54 · 74 阅读 · 0 评论 -
环形链表
题目描述:给定一个链表,判断链表中是否有环。使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。链接:https://leetcode-cn.com/problems/linked-list-cycle示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1原创 2021-03-06 15:28:14 · 60 阅读 · 0 评论 -
合并两个有序链表
题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1 = [], l2 = []输出:[]示例3:输入:l1 = [], l2 = [0]输出:[0]求解思路:创建两个引用分别指向两个链表的第一个节点,比较其两个值的大小,将较小的尾插到新链表;循环以上循环和尾插过程,直到其中某一链表到达null时,再将另一链表剩余原创 2021-03-05 20:43:46 · 78 阅读 · 0 评论 -
链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个结点。示例:求解思路:倒数第k个即为第 length - k 个,创建一个引用让其从头开始走 length - k 步即可。代码实现:public class Solution { //求链表长度 public int getLength(ListNode head){ int length = 0; ListNode cur = head; while(cur != null){原创 2021-03-05 19:29:40 · 60 阅读 · 0 评论 -
链表的中间节点
问题描述:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链接:此题链接示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。示例 2:输入:[1,2,3,4,5,6]输出:此列表中的结点 4 (序列化形式:[4,5,6]) 由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。求解思路:求出链表的长度length;length / 2,得到引用原创 2021-03-05 15:17:38 · 63 阅读 · 0 评论 -
反转链表
问题描述:反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL求解思路:创建三个引用:prevNode、curNode、NextNode分别指向前一个节点、当前节点和下一个节点。反转核心操作:让当前节点的next指向前一个节点。curNode.next = prevNode;更新三个引用。更新newHead的指向。让neHead指向最后一个节点。代码实现:class原创 2021-03-05 14:51:04 · 61 阅读 · 0 评论 -
移除链表元素(删除链表中等于给定值 val 的所有节点)
删除链表中等于给定值 val 的所有节点示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5求解思路:先删除中间的普通节点,再判断待删除节点是否是头节点。创建两个节点,一个指向要删除的元素,一个指向要删除元素的前一个元素。先处理中间元素,后处理头元素等于val的情况。防止1,2个元素均为要删除元素,而跳过删除第二个元素。循环比较是否等于val,等于则删除,不等于则prev和toD原创 2021-03-05 14:22:01 · 462 阅读 · 0 评论