![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 72
JingleLiA
这个作者很懒,什么都没留下…
展开
-
环形链表
题目链接:环形链表题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tr原创 2020-10-15 20:17:48 · 222 阅读 · 0 评论 -
单调栈问题合集
接雨水class Solution { public int trap(int[] height) { int ans = 0; int n = height.length,mmin; Stack<Integer> st = new Stack<Integer>(); int pos = 0,width,curh; for(int i = 0;i < n;i++){原创 2020-09-26 17:26:22 · 188 阅读 · 0 评论 -
柱状图中最大的矩形---从暴力到单调栈优化
题目链接:柱状图中最大的矩形题目描述:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10题目分析:矩形的面积是由宽度和高度共同决定的,因此我们可以通过枚举这两个值来求最大值。假如就选择高度好了,对于每个原创 2020-09-25 20:39:29 · 229 阅读 · 0 评论 -
判断二叉树是否为搜索二叉树和完全二叉树。
题目描述给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。示例1输入复制{2,1,3}输出复制[true,true]备注:n≤500000分析:BST特点:左子值比根节点小,右子值比根节点大完全二叉树特点:每一层节点按照从左到右的顺序存放,每一层必须放满才可以放下一层,比如下图两种就属于不合法的完全二叉树基于上述特点,我们可以写出代码:import java.util.*;/* * public class TreeNode { *原创 2020-09-24 15:55:19 · 384 阅读 · 0 评论 -
删除排序链表中的重复元素
题目链接:删除链表中的重复节点分析:有序链表,双指针/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode deleteDuplicates(ListNode head) {原创 2020-09-16 20:41:34 · 171 阅读 · 0 评论 -
链表求和
题目链接:链表求和题目描述:示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912进阶:假设这些数位是正向存放的,请再做一遍。示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295输出:9 -> 1 -> 2,即912分析:主要是这个while的判断条件写的很棒,省去了很多判断细节,比如一个链表遍历完,最后原创 2020-09-16 13:23:14 · 174 阅读 · 0 评论 -
复杂链表的复制
题目链接:复杂链表的复制题目描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例 2:输入:head = [[1,1],[2,1]]输出:[[1,1],[2原创 2020-09-16 12:32:39 · 178 阅读 · 0 评论 -
二叉搜索树的范围和
题目链接:二叉树的范围和题目描述:给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。二叉搜索树保证具有唯一的值。示例 1:输入:root = [10,5,15,3,7,null,18], L = 7, R = 15输出:32示例 2:输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10输出:23提示:树中的结点数量最多为 10000 个。最终的答案保证小于 2^31。题目分析:根据BST的特点,左子原创 2020-08-26 16:50:19 · 243 阅读 · 0 评论 -
Offer 22. 链表中倒数第k个节点
题目链接:倒数第K个节点题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.题目分析:双指针,使用2个指针保持K的间距,当一个节点达到链表末尾时,另一个节点即倒数第K个节点代码:clas原创 2020-08-26 12:13:49 · 99 阅读 · 0 评论 -
Offer 27. 二叉树的镜像
题目链接:二叉树的镜像题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4/ 2 7/ \ / 1 3 6 9镜像输出: 4/ 7 2/ \ / 9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]代码:递归方式:class Solution { public TreeNode mirrorTree(TreeNode root)原创 2020-08-26 12:08:42 · 106 阅读 · 0 评论 -
两个链表的第一个公共节点
今天七夕啦啦啦啦,作为单身狗,我决定送自己一个链表相交题,真是惨绝人寰,相互平行的链表都能浪漫相遇哦~题目链接:链表相交题目描述:输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点 c1 开始相交。题目分析:暴力直接遍历,找到相交的点即可public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { int len1 = 0,原创 2020-08-25 14:38:22 · 169 阅读 · 0 评论 -
归并/快速/堆/插入排序--Java实现
复习这几种排序的写法以及过程import java.util.*;public class Main { static Scanner in = new Scanner(System.in); static int ans = 0,n; static int[] a = new int[10005]; static void mergesort(int l,int r,int[] t){ if(r-l>1){ int m =原创 2020-08-07 15:05:50 · 158 阅读 · 0 评论 -
25. K 个一组翻转链表
题目链接:K个一组反转链表题目描述:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5题目分析:在单链表反转的基础上,每K个进行反转原创 2020-07-29 16:00:26 · 144 阅读 · 0 评论 -
合并K个排序链表
题目链接:合并K个排序链表题目描述:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6题目分析:基于合并2个有序链表的过程,合并K个链表,最简单的方式就是,将K个链表进行K-1次合并(每次合并2个,并保留上一次合并的结果进行下一次合并),这个时间复杂度是O(n2),寻求更低的时间复杂度是我原创 2020-07-28 11:47:09 · 161 阅读 · 0 评论 -
单链表的反转(Java实现)
如标题描述代码:import java.util.*;public class Main { static Scanner in = new Scanner(System.in); static int n; static void print(listNode head){ listNode first = head.next; while (first!=null){ System.out.print(first.v原创 2020-07-27 14:43:43 · 139 阅读 · 0 评论 -
295. 数据流的中位数
题目链接:数据流的中位数题目描述:中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)addNum(2)findMedian() -> 1.5addN原创 2020-07-24 12:43:10 · 155 阅读 · 0 评论 -
不同的二叉搜索树 II
题目链接:不同的二叉搜索树II题目描述:给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入:3输出:[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ /原创 2020-07-21 18:04:32 · 165 阅读 · 0 评论 -
面试题 17.13. 恢复空格
题目链接:恢复空格题目描述:哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意原创 2020-07-09 21:57:33 · 186 阅读 · 0 评论 -
112. 路径总和
题目链接:路径总和题目描述:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的路原创 2020-07-08 16:16:01 · 140 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目链接:实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]太简单了,直接贴代码:class CQueue { //两个栈,一个原创 2020-06-30 20:05:35 · 138 阅读 · 0 评论 -
215. 数组中的第K个最大元素
题目链接:数组中第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题目分析:TOP K问题,直接套堆模版即可代码:class Solution { public int findKthLargest(int[] nums, int k)原创 2020-06-29 20:22:26 · 134 阅读 · 0 评论 -
leetcode128最长连续序列
题目链接:最长连续序列题目描述:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。题目分析:关键点要求时间复杂度为O(n),那么排序啥的自然就不能用。先求出连续序列,然后找个最长的。这里主要是借助哈希去重表,如何达到O(n)的复杂度呢?在暴力枚举的过程中,我们在对每个数寻找连续序列的过程中进行了很多重复的判断,使用set可以把这原创 2020-06-08 11:32:32 · 177 阅读 · 0 评论 -
各种进制转换--利用Java类的静态方法
描述:我们经常会碰到各种进制转换的问题,当然手动模拟写一个简单的转换也是可以的,其实在java里面有很多可以直接利用的方法,这里我总结一下,方便使用,看实例吧:import java.util.*;public class Main { static Scanner in = new Scanner(System.in); public static void main(St...原创 2018-03-29 19:56:41 · 286 阅读 · 0 评论 -
map按照值排序
import java.util.*;public class Main { static Scanner in = new Scanner(System.in); static void print(int n, int v) { for (int i = 0; i < n; i++) System.out.print(v + " "); } public sta...原创 2019-11-23 18:09:51 · 933 阅读 · 0 评论 -
Java基本数据类型及其取值范围
Java分为以下数据类型:第一类:逻辑型boolean只能取true或者是false或者是结果为true或者是false的表达式,不能用一或零来代替,第二类:文本型char用单引号括起来:char a=' A'第三类:整数型(byte、short、int、long)char类型占2个字节short从-32768到32767int从-21474转载 2017-07-30 10:24:24 · 596 阅读 · 0 评论 -
Java优先队列初识
package aaa;import java.util.*;/* 优先队列,除了和普通数列的特点一样以外,此数列里面的每个数据都有一个优先级,每次操作包括查询,删除,插入, * 都是根据优先级进行的,说明白点就是已经排好序了呗,默认情况下是按照从小到大排序,也可以自己定义比较器来进行自定义排序 * 具体的实现原理可以参照我上节写的堆排序 * 这样就比较好玩了,再也不用用collect原创 2017-09-28 16:42:03 · 363 阅读 · 0 评论 -
堆排序Java实现
package aaa;import java.util.*;/* 堆排序,可以有效的降低时间复杂度 * 建立一个大顶堆并且进行堆排序输出从小到大排序的数 * 时间复杂度为O(NlogN) * 扩展:如果要求一个数列里面的第k大的数,只需要建立一个大小为k的小顶堆,并且不断调整维护(先选三个数建堆,后面的数逐个插入堆顶并进行删除调整), * 最后输出对堆顶元素即可 * 同理,求解一原创 2017-09-28 15:52:59 · 230 阅读 · 0 评论 -
非递归快排--Java
见标题package test;import java.util.*;public class Main { static Scanner in = new Scanner(System.in); static int partion(int[] array,int low,int high){//合并排序部分 int tmp = array[low]; ...原创 2019-11-11 20:56:29 · 248 阅读 · 0 评论 -
归并,快排,插入,堆各种排序实现
#include<iostream>#include<string>#include<cmath>#include<list>#include<algorithm>using namespace std;int a[205];int t[205];int n = 0,ans;void mergeSort(int* a,i...原创 2018-07-09 21:30:33 · 199 阅读 · 0 评论 -
排序小练习(桶,冒泡,快速)
import java.util.Scanner;public class Main { static Scanner in =new Scanner(System.in); static final int N=1000; static int k; //桶排序:快速,时间复杂度小,可以用来去重(数量较小时),但是有局限,不能排序小数,不能排序结构体原创 2017-08-31 10:10:47 · 245 阅读 · 0 评论 -
桶排序
经典排序算法 - 桶排序Bucket sort补充说明三点1,桶排序是稳定的2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法我自己的理解哈,可能与网上说的有一些出入,大体都是同样的原理无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为[0-9](考试转载 2017-08-05 10:44:37 · 891 阅读 · 0 评论 -
天梯赛--红色警报--dfs或者并查集
7-9 红色警报(25 分)战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1...原创 2018-03-17 13:33:42 · 352 阅读 · 0 评论 -
The Suspects --并查集水题
Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To minimize transmission to others, the best strategy is to s原创 2017-11-14 22:00:05 · 370 阅读 · 0 评论 -
Wireless Network --并查集
An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wireless network with the lap computers, but an unexpected aftershock attacked, all computers in the n原创 2017-11-14 21:46:03 · 343 阅读 · 0 评论 -
还是畅通工程--最小生成树+并查集
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 当N为0时,输入结束,该用例不被处理。 Output对每个测原创 2017-11-12 14:32:27 · 380 阅读 · 0 评论 -
- How Many Tables --并查集
Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, a原创 2017-11-12 12:00:55 · 295 阅读 · 0 评论 -
A - 畅通工程 --并查集
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? Input测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( 注意:两个城市之间可以有多条道路相通,也就是说 3 3原创 2017-11-12 11:57:27 · 279 阅读 · 0 评论 -
约瑟夫环--链表解法
问题描述:N个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)思路:借助循环链表思想,一维数组模拟即可,计算出每次需要移动到的位置,然后将这个数移除,指针后移继续,直到数组为空。移除的思路:在移动的过程中记录前一个位置,改变pre的指向,即跳过这个数指向下一个树import java.u...原创 2020-04-19 21:23:54 · 360 阅读 · 0 评论 -
归并排序+求解逆序数
描述:归并排序的递归写法,排序实质:分治思想,先将元素分为两个相等的部分进行排序,然后再进行归并,归并的过程其实就是排序的过程,等价于数据结构里面链表的归并过程。看代码:#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<queue&...原创 2018-06-14 18:48:06 · 284 阅读 · 0 评论 -
士兵杀敌(二)
描述南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。输入只有一组测试数据第一行是两个整数N,M,其中N表示士兵的个数(1随后的一行原创 2017-08-16 17:23:42 · 487 阅读 · 0 评论