算法与数据结构
文章平均质量分 65
智慧zhuhuix
这个作者很懒,什么都没留下…
展开
-
用哈希表解决leetcode罗马数字转整数问题
一、问题分析本文将继续使用Hash表的<Key,Value>映射结构来解决Leetcode问题。LeetCode14:罗马数字转整数单个罗马字符对应如下数值两个罗马数字对应如下数值:问题:输入一串罗马数字的字符串,根据罗马数字的对应关系算出整数值二、题解思路首先想到的肯定是将单个罗马字母对应的整数及两个罗马字母对应的整数通过哈希表建立映射关系;从前到后遍历输入的字符串,根据子字符串在哈希表中找对应的整数值,依次累加,直至循环结束。这里有个技巧,先原创 2021-07-08 16:25:35 · 178 阅读 · 0 评论 -
用哈希表解决一个经典的leetcode问题
文章目录一、哈希表二、LeetCode 1. 两数之和三、代码一、哈希表在记录的存储位置和它的关键字之间建立一个确定的对应关系H,以函数H(key)作为关键字为key的记录在表中的位置,这个对应关系H称为哈希(Hash)函数(又称散列函数),按这个思想建立的表为哈希表(HashTable)。哈希表的时间复杂度:在常规情况下查找、插入、删除都是O(1)二、LeetCode 1. 两数之和分析一下题目:题意 :给定数组与目标值,需要从数组中找出两个数,这两数相加之和等于目标值;如原创 2021-06-28 17:33:09 · 191 阅读 · 0 评论 -
用二分查找算法演练一个经典的LeetCode问题
文章目录一、背景二、LeetCode 162. 寻找峰值三、算法一、背景在《用二分查找算法演练一个简单的LeetCode问题》中,我们使用二分查找算法解决了一个实际问题。在《用二分查找算法演练一个复杂的LeetCode问题》中,我们使用二分查找算法解决了一个复杂问题。本文将通过这个代码模板去演练一个经典问题(查找大数或小数),再次加深对此算法的了解。二、LeetCode 162. 寻找峰值问题链接:https://leetcode-cn.com/problems/find-peak-ele原创 2021-06-25 14:02:54 · 138 阅读 · 0 评论 -
用二分查找算法演练一个复杂的LeetCode问题
文章目录一、背景二、LeetCode 240. 搜索二维矩阵三、算法一、背景在上文《用二分查找算法演练一个简单的LeetCode问题》中,我们使用二分查找算法解决了一个实际问题。本文将通过这个代码模板去演练一个LeetCode的复杂问题,再次加深对此算法的了解。二、LeetCode 240. 搜索二维矩阵问题链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一原创 2021-06-23 11:29:57 · 131 阅读 · 0 评论 -
用二分查找算法演练一个简单的LeetCode问题
文章目录一、背景二、LeetCode 35: 搜索插入位置三、算法一、背景通过上文《用一段动画看清二分查找算法的原理》我们了解了二分查找算法的底层原理及实现的代码模板。本文将通过这个代码模板去演练一个LeetCode的简单问题,以加深对此算法的了解。二、LeetCode 35: 搜索插入位置问题链接:https://leetcode-cn.com/problems/search-insert-position/该问题中其实包含了两层意思:如果在数组中存在目标值,就将目标值的下标找出原创 2021-06-21 15:46:23 · 152 阅读 · 2 评论 -
用一段动画看清二分查找算法的原理
文章目录一、背景二、使用前提三、动画实现四、代码模板一、背景二分查找是算法课程入门阶段经常被提到的一种算法,我们对其代码模板也已经滚瓜烂熟了。本文将会通过一段简单的动画来模拟二分查找的实现,让我们可以更直观地理解这个算法的底层原理。二、使用前提应用二分查找算法是有一定的使用前提的:查找的对象可以通过索引访问(对象一般为数组)存在左右边界(数组的左边界下标为0,右边界下标为数组长度减1)最关键的是这个查找的对象要有次序(数组是顺序递增或顺序递减的)三、动画实现请大家结合动画与原创 2021-06-17 08:44:14 · 391 阅读 · 0 评论 -
用Java语言编写菲波那契数列程序
文章目录一、了解菲波那契数列二、递归算法三、动态规划算法一、了解菲波那契数列斐波那契数列,又称黄金分割数列或兔子数列,该数列为0、1、1、2、3、5、8、13、21、34、…,可以看到它的性质是前两项之和等于后一项。用数学公式表示,即:F(N) = F(N - 1) + F(N - 2), (其中 N > 1且F(0) = 0, F(1) = 1)。菲波那契数列随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值0.6180339887……,黄金分割数又在自然界中无处不在,世界著名原创 2020-12-24 13:43:10 · 476 阅读 · 0 评论 -
说说贪心算法的实际应用
文章目录一、背景二、解题思路二、算法实现四、总结一、背景已知某公司2021年主要生产的产品有P个,每个产品的固定成本为Ci,且固定产能为T,如下表:产品成本P1C1P2C2P3C3……PiCi总产能T同时已知公司十大客户2021年对每个产品的需求量R与销售单价K,且十大客户总需求∑R大于公司总产能T,如下表:客户产品需求量(万)销售单价(元)客户1P1R1K1客户1P2R2K2原创 2020-12-16 17:10:41 · 2806 阅读 · 2 评论 -
自已作图搞清楚自平衡的二分搜索树(二)---通过旋转操作实现AVL树的平衡
文章目录一、背景二、旋转操作2.1 L L--需要通过右旋操作2.2 R R--需要通过左旋操作2.3 L R--需要先通过左旋再右旋操作2.4 R L--需要先通过右旋再左旋操作二、AVL树完整代码实现一、背景通过上篇文章《自已作图搞清楚自平衡的二分搜索树(一)—AVL树的定义及原理》,我们了解了AVL树的实现原理,并在文末通过实例演示了在AVL树加入一个节点,破坏了AVL的平衡性;本文将通过动画的形式展现通过旋转操作调节平衡性,最终保持AVL树的构成。二、旋转操作往AVL树中添加结点很可原创 2020-07-22 17:56:32 · 377 阅读 · 0 评论 -
自已作图搞清楚自平衡的二分搜索树(一)---AVL树的定义及原理
文章目录一、背景二、平衡二分搜索树(AVL树)2.1 AVL树的基本概念结点高度平衡因子一、背景二叉树是一种常用的数据结构,更是实现众多算法的一把利器。(基本定义可参考《自己动手作图深入理解二叉树、满二叉树及完全二叉树》)二分搜索树(Binary Search Tree)做为一种能实现快速定位查找的二叉树也得到了广泛应用(算法可参考《用一个图书库实例搞懂二分搜索树的底层原理》)。1 二分搜索树是一颗二叉树2 二分搜索树每个节点的左子树的值都小于该节点的值,每个节点右子树的值都大于该节点的值3原创 2020-07-21 10:30:52 · 475 阅读 · 0 评论 -
用自行实现的优先队列进行四字成语汉字频率统计
背景在《自已做动画及编写程序搞清楚最大堆的实现原理》这篇文章中,我们通过动图分析编 码自行实现了最大堆的数据结构,并在文章末尾提到了最大堆的应用–优先队列。该文将通过“四字成语汉字频率统计”的实际应用,把最大堆与优先队列的原理再次进行深入剖析。最大堆构建最大堆...原创 2020-07-01 16:31:01 · 494 阅读 · 0 评论 -
自已做动画及编写程序搞清楚最大堆的实现原理
文章目录背景概念最大堆最大堆的线性存储动画实现最大堆加入新元素代码实现最大堆加入新元素动画实现最大堆取出最大元素代码实现最大堆取出最大元素程序测试最大堆的应用--优先队列写在最后背景二叉树是数据结构中的重点,也是难点。二叉树比数组、栈、队列等线性结构相比复杂度更高,想要做到心中有“树”,需要自己动手画图、观察、思考,才能领会其真谛。在上篇文章《自己动手作图深入理解二叉树、满二叉树及完全二叉树》中,我们对完全二叉树有了一定认识,该文将对一种特殊的完全二叉树”最大堆”进行底层研究。概念堆(hea原创 2020-06-28 15:20:25 · 368 阅读 · 1 评论 -
自己动手作图深入理解二叉树、满二叉树及完全二叉树
文章目录背景概念结点二叉树二叉树的深度满二叉树完全二叉树完全二叉树的线性存储完全二叉树的创建与遍历背景二叉树是数据结构中的重点,也是难点。二叉树是一种非线性结构,比数组、栈、队列等线性结构相比复杂度更高,想要做到心中有“树”,需要自己动手画图、观察、思考,才能领会其真谛。该文将会结合图形,深入理解二叉树、满二叉树及完全二叉树的概念。概念结点结点是组成二叉树的最小单元。– 用图形表示– 用代码表示 // 结点 class Node<E> { E e;原创 2020-06-24 17:36:37 · 4041 阅读 · 5 评论 -
用一个图书库实例搞懂二分搜索树的底层原理
文章目录一、背景二、概念1、定义2、 动画示例三、图书库实例3.1、项目需求3.2、代码结构3.3、图书类3.4、二分搜索树的底层实现3.5、图书库的构建四、深入理解一、背景二叉树是一种常用的数据结构,更是实现众多算法的一把利器。本文将通过建立一个图书库的实例对二叉树中的常用类型:二分搜索树(Binary Search Tree)进行底层原理的深入理解。二、概念1、定义1 二分搜索树是一颗二叉树2 二分搜索树每个节点的左子树的值都小于该节点的值,每个节点右子树的值都大于该节点的值3 任意一个原创 2020-06-23 14:54:24 · 437 阅读 · 0 评论 -
哈希表(HashTable)的深入理解及实际演练
文章目录概念哈希函数的构建哈希函数构建的代码演练哈希地址冲突的处理冲突的处理办法哈希地址解决冲突的代码演练哈希表的查找概念在记录的存储位置和它的关键字之间建立一个确定的对应关系H,以函数H(key)作为关键字为key的记录在表中的位置,这个对应关系H称为哈希(Hash)函数(又称散列函数),按这个思想建立的表为哈希表(HashTable)。哈希函数的构建直接定址法:取关键字key的一个线性函数为哈希函数,即:H(key)=a×key+b,其中a、b为常数,且a≠0。– 举例:学生表关键字原创 2020-06-19 17:48:32 · 790 阅读 · 0 评论 -
以猜数字游戏引出的分治算法的理解与思考
文章目录一、背景二、猜数字游戏2.1 游戏规则2.2 猜数字游戏源码2.3 猜数字游戏技巧三、分治算法3.1 思想与策略3.2 适用的特征3.3 分治算法的典型应用3.3.1 归并排序的原理3.3.2 自顶向下的归并排序源码四、总结一、背景分治算法是计算机五大常用算法之一,也是在JAVA编程中经常用到的算法之一。对于分治算法的理解,往往会停留在一些枯燥的概念上,比如“分而治之”,“问题原子分解”等。该文将会通过一个猜数字的游戏入手,引出对于分治算法基本思想的思考。二、猜数字游戏2.1 游戏规则由原创 2020-06-11 16:39:59 · 958 阅读 · 0 评论 -
用队列实现栈,用栈实现队列,听起来有点绕,都搞懂了就掌握了精髓!
文章目录一、背景二、概念2.1 栈2.2 队列三、栈和队列的相互实现3.1 用队列实现栈3.2 用栈实现队列四、总结一、背景栈和队列是数据结构中最常用到的两种结构,有非常广泛的运用,该篇文章将通过动画的手段,展示栈和队列相互实现的底层原理,让我们真正搞懂栈和队列的特性。二、概念2.1 栈栈[Stack]:是一种限定仅在表尾进行插入和删除操作的线性表;即后进先出(LIFO-last in first out),最后插入的元素最先出来入栈(push)出栈 (pop)2.2 队列队原创 2020-06-09 18:34:12 · 411 阅读 · 0 评论 -
用一个通用测试类简化排序算法时间复杂度的研究
文章目录一、背景二、概念2.1、时间复杂度的定义2.2、时间复杂度的比较三、测试类3.1、程序结构3.2、测试工具类3.3、 排序算法接口定义3.4、 各种排序算法的实现3.5、 测试主程序3.6、 测试分析四、写在最后一、背景在学习算法的过程中,除了熟练掌握各种算法的程序逻辑外,还经常需要用到一些测试案例对算法的时间复杂度做具体的测试。本文将通过打造一个测试类工具包,让我们可以更简便地研究排序算法的时间复杂度。二、概念2.1、时间复杂度的定义即从序列的初始状态到经过排序算法后形成的最终排序状态原创 2020-06-06 12:51:21 · 310 阅读 · 0 评论