算法与数据结构
朝阳映木
笨笨的企鹅w
展开
-
图系列(四)欧拉通路与欧拉回路
欧拉通路与欧拉回路之前,写了图系列一二三,现在出四啦!这也意味着,对于图的部分,可以说50%以上常用的内容就已经过了一遍了。欧拉路的部分会稍微难一点,主要是我们要和定义打交道了。至于其他图的理论,我感觉比较有用的就不剩下多少了。可能就还有同构什么的,还会有一些探讨的空间。好长一段时间没有写东西啦!这篇文章,大致会经过几次修改完成。主要参考了Leetcode的这道题——重新安排行程。其实,这道题目,用图一二三的方法也能解决,但是非常复杂,我花了很长时间。定义下面这段话,请同学们略过。我真是越原创 2020-09-09 10:48:33 · 2029 阅读 · 0 评论 -
备忘 - 组合与排列的算法实现
组合我的处理方式主要是通过递归方式进行遍历。同时利用boolean[]数组,来判断某个数字有没有被用过。辅助以Stack,进行数据的存储,注意Stack可以是正常的Stack类,也可以是一般的数组。public void iteratePermutation(int n, int k) {// P(n, k) boolean[] used = new boolean[n]; int[] permutation = new int[k]; for (int i = 0 ; i原创 2020-09-08 12:11:20 · 215 阅读 · 0 评论 -
随机——随机取点
随机取点这两天做了LeetCode上面关于Random的系列问题,虽然问题不多,但是能提供解决随机问题的经典思路——按权重采样和拒绝采样。我们这里只是讨论关于随机去点的基本问题,后面没时间的话,可能不会深究。Java Random API首先,当然是最经典的Math.random(); 返回[0,1)的一个double值,区间内任意一个点被取到的概率都是等可能的。double x...原创 2020-02-05 11:10:50 · 1146 阅读 · 0 评论 -
树(一)树的遍历
树的遍历近期参加复旦互联网协会的刷题营,所以我勉勉强强又开始做题啦。现在变得更务实啦,要想提升能力,超过别人就是要依靠一项项的指标的胜利,这样的评价是更加客观的。想要提升能力,一方面要靠平时的积累,另外一方面也要依靠瓶颈期的奋力一搏。当然,我的意思是更加侧重前者的。话不多说啦,开始今天的话题——树的遍历。如果用递归的方法是非常简单,也是非常推荐的。但是,用迭代的方法也不难!!!所以我决定在这里...原创 2020-01-31 12:19:02 · 410 阅读 · 0 评论 -
堆(二)优先队列
优先队列使用最大堆或者最小堆来实现一个优先队列是非常合适的。这个优先队列需要实现插入新值、改变键值和抽取最大/最小元素的功能。实现如下:package heap;public class PriorityQueue <T extends Heap> { private T heap; public PriorityQueue(T heap) { ...原创 2019-09-06 11:22:30 · 165 阅读 · 0 评论 -
堆(一)最大堆和最小堆的实现
最大堆和最小堆的实现这一讲讲的还是堆,因此将它归入到堆(一)中。这一篇博客的目的非常简单,就是补充一下,堆的实现代码。Heap是抽象类,它有两个子类,MaxHeap和MinHeap。至于它们的function,我不再赘述了,请看堆(一)堆排序。HeapHeap,代码如下,它是一个抽象的父类。其实只有两个方法,buildHeap和heapify。其中,heapify方法由子类重写,如果我...原创 2019-09-05 21:40:01 · 1203 阅读 · 0 评论 -
堆(一)堆排序
堆堆主要应用于维护一个优先队列,当然还有进行堆排序。堆的部分将会分为三个部分来讲,分别是堆排序,优先队列的实现和斐波那契堆,从易到难。本文大部分参考了《算法导论》第六章的内容。堆基础操作和性质二叉堆实际上是用数组实现的,如下图所示(图参考了《算法导论》,使用0-index)。这个是最大堆,最大的元素在堆的顶上。接下来将用list指代下面的数组。将它化成堆,也就是从root开始,...原创 2019-09-04 22:29:10 · 159 阅读 · 0 评论 -
链表常见操作(二)哑表头与倒数K元素
哑表头与倒数K元素链表最大的好处是非常灵活,内存管理和增删都比较方便。弱点是查询的时候几乎没有捷径,必须遍历链表。以及,更改指针会把人弄晕。不过,链表的优点对我们来说太重要了,在JAVA方面内存管理实际上也是一个重要的话题,比如new int[10亿] (4GB 内存没了),java有自己的解决方案,比如链表和BitSet。OK,让我们继续熟悉链表吧!(PS: 这一篇很基础)哑链表头 - ...原创 2019-08-11 11:49:36 · 190 阅读 · 0 评论 -
链表常见操作(五)排序与递归
排序与递归 好像差不多了, 这是链表的最后一讲了. 这一讲主要讲链表的排序, 要知道, 链表中也存了数据, 既然存了数据, 就无法避免地要面临排序的问题. 那么, 堆排序? 插入排序? 还是归并排序? 还是快速排序呢? 让我们直接看看效果好了!链表排序插入排序法public ListNode sortList(ListNode head) { ListNod...原创 2019-08-14 14:36:18 · 400 阅读 · 0 评论 -
链表常见操作(四)修改指针与环操作
修改指针与环操作 OK, 八个空格, 我们继续学习链表常见操作. 接下来主要分为两个部分的内容, 第一个部分, 总结链表中修改指针的题目; 第二部分, 讲环形链表! 可能第二个部分比较有干货.链表问题的特性 - 修改指针 链表的问题实际上, 就是修改指针走向的问题. 很多时候多多画图, 用几个临时变量ListNode就可以解决了. 即使想要新建一个链表成本也...原创 2019-08-14 13:46:23 · 676 阅读 · 0 评论 -
链表常见操作(三)链表长度与翻转
链表长度与翻转 谨以此纪念我在某尼划水的时光! /手动滑稽 继续熟悉链表吧, 接下来介绍使用频率最高的两个操作, 获取链表长度和翻转链表. 真的很简单, 但是使用频率非常高!获取链表长度 首先, 很多人可能认为, 获取链表长度的复杂度是O(n), 代价很高. 其实不然, 我们用这个不等式作为复杂度的标尺: O(1) < O(logn)...原创 2019-08-14 11:33:48 · 885 阅读 · 0 评论 -
图系列(二)图的遍历与拓扑排序
图的遍历与拓扑排序好了,接下来是重中之重图的遍历。图遍历是很多其他算法的基础,比如Dijkstra算法。图的遍历广度优先遍历广度优先遍历的关键是需要借助一个队列。代码如下:class Solution { List<Integer>[] adjs; public void bfs(int n, int[][] edges) { //...原创 2019-08-18 20:15:24 · 713 阅读 · 0 评论 -
图系列(一)图的表示与入度
图的表示与入度 虽然好像没什么人看,但是我还是写一下,佛系。就当给自己做一个备忘录好了!总算,进入到图系列了。图的部分,问题很多,算法很多,应用也很广。图的两个比较重要的基石就是图的表示和图的遍历。有了这两个才能更好地搭建其他的算法。图的表示 我们知道G = (V, E),所以最原始的表示方式是,int n, int[][] edges。其中,n表示有n个节点...原创 2019-08-18 20:11:21 · 5016 阅读 · 0 评论