数据结构
文章平均质量分 50
数据结构
hi wei
不问未来,只争现在
展开
-
leetcode:图解复制带随机指针的链表
题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么原创 2021-05-14 12:21:13 · 3225 阅读 · 2 评论 -
leetcode每日一练:链表两数相加 II
题目给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7题解 两个链表需要从末尾相加,则在不反转链表的情况下,我们原创 2021-05-19 11:54:15 · 277 阅读 · 0 评论 -
leetcode:链表求和
题目给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912示例:输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295输出:9 -> 1 -> 2,即912题解原创 2021-05-14 17:00:57 · 14971 阅读 · 0 评论 -
图文并茂:实现二叉查找树
二叉树二叉搜索树二叉搜索树满足条件:是一个二叉树。每个节点则左子节点小于该节点,右子节点大于该节点。二叉树搜索树的添加节点例如:4,5,10,2,7,13,8,6,9,11删除节点删除一个节点有三种情况:该节点为叶子节点直接删除该节点只有一个子节点该节点子节点替换为该节点。该节点下有左右两个子节点取该节点右子节点的最小叶子节点替换该节点。代码实现二叉搜索树package tree;/** * @author zhw * @description * @原创 2021-05-21 16:02:59 · 3089 阅读 · 0 评论 -
leetcode:反转链表
题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。// Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->N原创 2021-05-12 18:18:02 · 14678 阅读 · 0 评论 -
详解二叉树的遍历实现,有图有代码
二叉树的遍历 二叉树的遍历可以分为:前序遍历,中序遍历,后序遍历。这里的序我们可以记为父节点所在的顺序。则打印顺序为:前序遍历:父->左子->右子;中序遍历:左子->父->右子;后序遍历:左子->右子->父;注意点:如果该二叉树为二叉搜索树,中序遍历的结果,是递增有序的序列。例如:节点定义: //Definition for a binary tree node. public class TreeNode { int val;原创 2021-05-22 11:34:43 · 3223 阅读 · 2 评论 -
经典算法二分法
基础BasicBinarySearch有序数组,数组内元素无重复,例如[1,3,4,6,7,8,9,12,14,15,16,10],查询数字在数组内的下标返回,数组内无该数字则返回-1。代码实现:public class BasicBinarySearch { public static void main(String[] args) { int[] ints = {2,3,7,8,9,12,34,56,78,110}; System.out.println(原创 2021-05-17 14:07:33 · 83 阅读 · 0 评论 -
leetcode:子集
题目给你一个整数数组 nums ,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]提示:1 <= nums.length <= 10-10 <= nums[i] <= 10nums 中的所有元素互不相同。题解将原创 2021-05-16 20:22:22 · 14417 阅读 · 0 评论 -
LRU和LFU算法
图解LRU算法和LFU算法,并附有代码实现。原创 2021-05-15 11:23:19 · 3428 阅读 · 0 评论 -
leetcode每日一练:寻找峰值
题目峰值元素是指其值大于左右相邻值的元素。给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。示例 1:输入:nums = [1,2,3,1]输出:2解释:3 是峰值元素,你的函数应该返回其索引 2。示例 2:输入:nums = [1,2,1,3,5,6,4]输出:1 或 5解释:你的函数可以返回索引 1,其峰值元素为 2;或者返回索引 5, 其峰值原创 2021-05-18 18:58:01 · 78 阅读 · 0 评论 -
二分法解经典题目:切木头
题目给出不同长度的木头[232,114,258],从中切出K段长度相同木头,所切的木头要为能切取的最长长度。返回切取木头的长度。示例1[232,114,258] K=1输出:258示例2[232,114,258] K=5输出:114题解public class WoodCut { public static void main(String[] args) { int[] L={232,124,456}; int i = woodCut(L, 7原创 2021-05-18 19:59:03 · 404 阅读 · 0 评论 -
leetcode:接雨水,动图简单易懂
题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length0 <= n <= 3 *原创 2021-05-20 11:42:50 · 288 阅读 · 0 评论 -
leetcode每日一练:两数之和 II - 输入有序数组
题目给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例 1:输入:numbers = [2,7,11,15], target原创 2021-05-19 09:42:41 · 261 阅读 · 0 评论 -
详解字典树:trie
字典树又称前缀树,我们根据前缀可以快速查找出该前缀的单词。例如google的搜索:基本结构代码实现:class TrieNode{ public Character c; public boolean hasWord; public HashMap<Character,TrieNode> children = new HashMap<>(); public TrieNode(){ } public TrieNode(Cha原创 2021-05-28 10:17:51 · 3086 阅读 · 0 评论 -
数据结构-栈
栈 栈是一种简单的数据结构。是一种先进后出的结构,类似于羽毛球桶里存放羽毛球,先放进去的羽毛球只能最后才能取出来。栈是一种线性数据结构,我们可以使用数组、链表等实现栈。利用栈的先进后出的特性可以实现很多功能。例如:文本中的括号匹配校验;浏览器访问记录的回退等功能。括号的匹配校验import java.util.Stack;/** * @author zhw */public class Test { public static void main(String[] args) {原创 2021-04-14 16:12:21 · 3208 阅读 · 1 评论 -
再简单不过的雪花算法
雪花算法在分布式部署的情况下,生成唯一Id的生成显得很麻烦。雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求,得益于twitter内部牛逼的技术,雪花算法流传至今并被广泛使用。它至少有如下几个特点:能满足高并发分布式系统环境下ID不重复基于时间戳,可以保证基本有序递增(有些业务场景对这个又要求)不依赖第三方的库或者中间件生成效率极高雪花算法原理组成:1bit符号位(0)+ 41bit时间戳 + 10bit机器号 + 12bit序列41bit时间戳,支持约69年。原创 2021-10-09 10:48:28 · 3342 阅读 · 0 评论 -
HashMap原理解析
什么是哈希表哈希表是数组的一种扩展,它利用的是数组支持按下表直接查找的特性。没有数组就没有哈希表。数组是一串连续的内存空间:在使用数组的时候,可以按下标直接得到内存地址值,这样就可以直接得到想要的数据,所以数组在使用下标访问时算法复杂度位O(1)。在这种高效的查找方式基础上诞生了哈希表:在我们往哈希表中存储数据的时候,通过哈希函数把key值映射未数组下标,然后将value存储在对应下标的数组空间里。这样在访问时,就可以hash(key)获取到对应下标,从对应的数组下标的位置取数据。实现O(1)原创 2021-04-03 16:03:06 · 3180 阅读 · 0 评论 -
海量数据处理:桶排序
分桶排序 桶排序采用了分而治之的思想。在处理大量数据的排序时,如果收到内存和时间的限制时,我们将数据进行拆分到小单元,单元内进行排序,这样就可以使用小内存排序大数据。也可以使用多线程排序小单元数据,最后进行数据合并完成整个数据的排序。在桶排序中关键点是数据分桶的处理。如果需要排序的数据不是线性递增的,就可能导致分桶数据不均匀,极端情况出现数据全部分到一个桶中,编程单个算法排序了。桶排序适合均匀分布的相对比较密集的数据。代码demo实现import java.util.ArrayList;imp原创 2021-04-13 20:37:44 · 3470 阅读 · 2 评论 -
java基础:排序算法
冒泡排序、选择排序、插入排序、快速排序原创 2021-04-19 21:44:23 · 7295 阅读 · 0 评论