数据结构&算法
文章平均质量分 82
记得平时多练练手。
少歌
轻轻地我走了,正如我轻轻地来,挥一挥衣袖,不带走一片云彩。
展开
-
自定义有向图的深度优先遍历(DFS)
何为图(Graph)形似如下抽象结构:这看起来的确有点抽象 ̄□ ̄||。。我们再看一张:这是一张二叉树,我在之前图的基础上减去了几根“联系”就变成了树。所以在一定程度上,可以把图理解为树延伸(图进一步的打破了树的“规矩”)。程序中的“图”图的存储需要一个集合(Set)来存储我们的节点元素。需要一个映射(HashMap)来存储节点是否被访问过。需要一个 HashMap<T, ArrayList> 来存储节点间的通路。如下图所示:代码实现DFS深度优先遍历原创 2021-05-24 23:10:13 · 6497 阅读 · 11 评论 -
数据结构——稀疏数组详解
稀疏数组是为了解决普通二维存储浪费空间而提出的一种 存储思想。棋盘问题普通二维存储:浪费很多空间,因为大部分都是 " 0 ",有效数字就两个。稀疏数组存储:只存储有效数的对应信息(个数、位置、数值);以及二维数组的基本信息(行、列)。代码实现/** * @ClassName SparseArray 稀疏数组 * @Description * @Author SkySong * @Date 2020-09-19 15:44 */public class Sparse原创 2020-09-19 17:00:28 · 182 阅读 · 0 评论 -
Leecode:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数
题目/*** 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。* 示例 1:* 输入: [1,3,4,2,2]* 输出: 2* 示例 2:* 输入: [3,1,3,4,2]* 输出: 3* 说明:* 不能更改原数组(假设数组是只读的)。* 只能使用额外的 O(1) 的空间。* 时间复杂度小于 O(n2) 。* 数组中只有一个重复的数字,但它可能不止原创 2020-11-10 14:07:31 · 2816 阅读 · 7 评论 -
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它
题目给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路代码先看链表节点结构:(这里用一个静态内部原创 2020-11-04 20:37:05 · 792 阅读 · 0 评论 -
LeetCode:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序
题目给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例 1:输入:[-4,-1,0,3,10]输出:[0,1,9,16,100]示例 2:输入:[-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= A.length <= 10000-10000 <= A[i] <= 10000A 已按非递减顺序排序。思路情况①数组里的元素都是非负数。这种情况就比较好解决了,直接按原创 2020-11-03 22:18:53 · 2292 阅读 · 2 评论 -
两个链表找首个共同节点
明确问题两个链表,说明有两个头节点(这明显是句废话!)共同节点,说明这两个链表相会了(就是都指向了同一个节点。)如图:图随丑了点,但也算清晰明了(强行解释!)明确思路首先我们要判断的不是“值”,想不想等,而实“指针”(Java里应该叫做引用。)解法1:暴力(不推荐!)如果你用暴力的话,这道题就没有意义了!(这句话说的的确很中肯。)循环得出两个链表每个结点的 next(尾部:用来存放下一个节点引用的),然后再一个一个的对比时间复杂度:n的平方解法2:找规律(推荐!)链表只原创 2020-09-14 20:00:24 · 501 阅读 · 1 评论 -
笔试!有价值的数。
这是一道 某大厂 的 笔试题:给出一个数组,找到其中有价值的数的个数。有价值的数:此数 左边 有 刚好比起大的数,右边 有 刚好比其小的数,比其大的数 是 比其小的数 的 倍数。//有价值的数,左边有刚好比其大的数big,右边有刚好比他小的数small,,big是small的倍数 public static void main(String[] args) { Scanner s = new Scanner(System.in); //输入数组长度原创 2020-06-14 10:54:11 · 128 阅读 · 0 评论