数据结构与算法
情谊风月
溪云初起日沉阁,山雨欲来风满楼
展开
-
二叉树及其遍历
二叉树是每个节点最多只有两个分支的树结构,两个分支一般称为左子数和右子树。二叉树的分支具有左右次序,不能颠倒。二叉树通常作为数据结构应用,应用于高效率的搜索和排序,红黑树、B树等都属于它的变体。红黑树(Red-Black Tree)的实际应用非常广泛,比如Linux内核中的ext3文件系统、Java的HashMap、TreeMap和TreeSet,C++ STL的map。满足一定条件的二叉...原创 2018-10-01 17:10:29 · 288 阅读 · 0 评论 -
136. Single Number
description:Given a non-empty array of integers, every element appears twice except for one. Find that single one.require:Your algorithm should have a linear runtime complexity. Could you implement i...原创 2019-01-29 22:29:38 · 183 阅读 · 0 评论 -
104. Maximum Depth of Binary Tree
description:Given a binary tree, find its maximum depth.The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.Note: A leaf is a node with ...原创 2019-01-27 22:52:19 · 218 阅读 · 0 评论 -
344. Reverse String
Reverse Stringdescription: Write a function that reverses a string. The input string is given as an array of characters char[].require: Do not allocate extra space for another array, you must do t...原创 2019-01-27 21:53:21 · 188 阅读 · 0 评论 -
约瑟夫环问题
问题描述:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号1的人开始报数,数到k的人出局;下一个人又从1开始报数,数到k的人出局。依此规律重复下去,直到只剩下一个人。求每次出局的人的编号及最后剩下的人的编号。解析:题目要求输出每次出局的人的编号,因此采用模拟法模拟过程。以5个人为例,从第一个人开始报数,数到3的人出局。过程如下:循环链表解法可以采用循环链表解决约瑟...原创 2018-10-20 23:58:12 · 956 阅读 · 0 评论 -
JVM 垃圾回收机制
垃圾回收(Garbage Collect,简称GC)是编程语言中提供的内存管理功能。在一些不具备GC的语言如 C++中,手动创建对象后需要在不使用该对象上手动释放它的内存空间,防止内存泄漏。另外一些语言如 Java、Python 等则无需手动管理内存,内置了垃圾回收机制,使开发人员从内存管理上解脱出来。在垃圾回收之前,首先要要找出死亡的对象,或者说仍旧存活的对象,存活对象的判定主要有如下两种算...原创 2018-10-14 12:22:32 · 220 阅读 · 0 评论 -
最大子序列和问题
最大子序列和是指,给定一组序列,如 [1,-3,2,4,5],求子序列之和的最大值,对于该序列来说,最大子序列之和为 2 + 4 + 5 = 11。这里的子序列要求是连续的,因此也可以称其为连续子数组最大和。有几种不同的方法求解最大子序列和问题,但它们的复杂度相差甚远,尤其在面对大量数据的时候。实际上,效率最高的算法非常简短,只需要几行代码,最主要的是理解它的思想。基本算法这是一种比较容...原创 2018-10-14 11:48:08 · 31621 阅读 · 6 评论 -
字符串匹配 KMP 算法
KMP算法是 BF(Brute Force) 算法的一种改进算法,是一种较为高效的字符串匹配算法。相比 BF 暴力匹配算法,KMP 算法的思想是利用已匹配的信息,使得能够不发生回溯,也就是当发生不匹配时,文本串(source)的位置不变,尽量向右移动模式串(target),如下图所示:前缀与后缀KMP 算法的核心是 next 数组的求解,而要理解 next 数组需要先理解前缀和后缀的概...原创 2018-10-14 09:33:38 · 295 阅读 · 0 评论 -
最小堆解决 Top K 问题
Top K 问题指从一组数据中选出最大的K个数。常见的例子有:热门搜索前10,最常听的20首歌等。对于这类问题,可能我们会首先想到先对这组数据进行排序,再选取前K个数。虽然这能解决问题,但效率不高,因为我们只需要部分有序,它却对整体进行了排序。最小堆是解决Top K 问题的一个好的方法(如果我们需要选出K个最小的数,用的是最大堆)。Top K 实现步骤最小堆也叫小根堆,实际上是一个完全二...原创 2018-10-14 00:00:53 · 1026 阅读 · 0 评论 -
Java 优先级队列
队列(queue)是一种先入先出(FIFO)的数据结构。栈中的插入和移除数据项的命名一般都是Push、Pop,而队列至今没有标准化的命名。插入操作可以用add、offer、enque等命名,移除操作可以用poll、remove、deque等命令,查看队头操作可以用peek、remove等命令。在 Java 中,常见的队列操作以及它们的区别如下所示:插入offer向队列插入元素,在一...原创 2018-10-13 23:35:01 · 10371 阅读 · 0 评论 -
迭代与递归实现
迭代(iterate)与递归(recursion)是解决问题常用的两种方法。递归指方法在内部调用自身。方法调用的时候,每次调用时要做地址保存,参数传递等。迭代通过循环来重复执行同一步骤,一般递归都可以转化为迭代来解决。阶乘的两种实现求阶乘是一个典型的例子,下面分别用迭代与递归实现。public class Factorial { /** * 递归实现阶乘 ...原创 2018-10-06 13:41:37 · 1402 阅读 · 0 评论 -
经典排序算法 — Java 实现
排序算法的好坏对于效率的影响十分显著。好的排序算法排序100万个整数可能只需要一秒(不考虑硬件因素),不好的排序算法可能需要一个小时甚至几个小时。常见的排序算法有冒泡排序、插入排序、堆排序、快速排序等,这些排序都属于基于比较的排序,因此这些算法的时间复杂度都不能突破O(NlogN)。还有另一类非基于比较的排序,包括基数排序、桶排序、计数排序。冒泡排序一般情况下效率比较低,在此不再赘述。插...原创 2018-10-04 11:57:08 · 409 阅读 · 0 评论 -
HashMap 原理浅析
HashMap可以说是使用频率相当频繁的一类Java容器了,它主要用来存放键值对<key,value>数据,如“姓名”:“张三”、“年龄”:“18”等等。HashMap中可以存放null,但key是唯一的,value可以重复。当你将多个key相同的键值对存储进HashMap中时,只会显示最后放的键值对数据。HashMap是无序的,原创 2018-10-02 13:13:32 · 244 阅读 · 0 评论 -
283. Move Zeroes
description:Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.Example:Input: [0,1,0,3,12]Output: [1,3,12,0,0]req...原创 2019-01-29 22:47:50 · 200 阅读 · 0 评论