
数据结构
RBreeze
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭
展开
-
冒泡排序(包括两种优化)
说明稳定性:稳定时间复杂度:最好-O(n);最坏O(n^2);平均O(n^2);空间复杂度:O(1)使用场景:数据规模小的场景算法思想:比较相邻的两个元素,将较小的数交换到左端,直到序列有序。实现说明:包含两层循环,每次外层循环冒出最大的一个数到length-1-i的位置,内存循环,每次比较相邻两个数,将较大数换到后面直到length-i-1位置。优化说明:包括两种优化,优化外层...原创 2018-05-13 12:38:19 · 328 阅读 · 0 评论 -
LeetCode——第108题:将有序数组转化为二叉搜索树
题目:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:0 / \ -3 9 / ...原创 2018-07-31 20:26:32 · 1059 阅读 · 0 评论 -
LeetCode——第88题:合并两个有序数组
题目:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入: nums1 = [1,2,3,0,0,0], m = ...原创 2018-07-31 20:57:34 · 419 阅读 · 0 评论 -
LeetCode——第287题:第一个错误版本
题目:你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测...原创 2018-07-31 21:22:08 · 552 阅读 · 0 评论 -
快速排序
算法思想:快速排序采用了分治的思想,在对数组进行排序时,首先选取数组中的一个元素作为基准元素,然后将数组中所有小于等于基准元素的元素放在基准元素的左边,而大于基准元素的放在基准元素的右边,然后对基准元素的左右两边的序列采用同样的方式对其进行排序。代码实现思路:在代码实现中都是选择第一个元素作为基准元素。思路1:在白话经典算法系列之六 快速排序 快速搞定中提出的是挖坑填数的方法,...原创 2018-08-14 16:49:32 · 488 阅读 · 0 评论 -
归并排序分析实现
算法思想:对于一个待排序的数组,我们可以将其分成两部分,先对这两部分进行递归的归并排序,然后在将这两部分合并。归并排序算法运行轨迹代码实现思路:思路1:采用自底向上的非递归方式实现。思路2:采用自顶向下的递归方式实现。优化方法:在合并函数中每次都new一个临时temp数组可以通过传递一个临时数组temp来小小的优化一下。在合并前简单的判断nums[mid]和...原创 2018-08-14 20:37:55 · 508 阅读 · 0 评论 -
希尔排序分析实现
算法思想:希尔排序又叫缩小增量,也是一种插入排序。希尔排序中有一个步长,通过这个步长将数组分化为步长个序列,然后分别对这些序列进行直接插入排序,然后改变步长,重复操作,直到步长为1,而此时数组基本有序,很快。步长的取法一般是开始为(数组长度/2),然后是对步长一直除2直到步长为1。算法运行过程图:代码实现思路:思路1:按照算法思想,有一个循环步长的循环,然后对某个步长划分...原创 2018-08-14 22:43:59 · 362 阅读 · 0 评论 -
堆排序分析实现
算法思想若升序,建大堆,每次选择堆顶元素即最大的数,和最后一位交换,再缩小堆的范围(避免刚排好的最后一个位置被调回去),对剩下的进行向下调整(此时只有根节点不对,左右子树都满足大堆)。反复进行直到堆的范围为0.则数据就有序了。代码实现思路堆排序的实现首先是需要将数组调整为一个大堆或者小堆,然后就是循环交换和调整堆的过程。因为在建堆和调整堆过程都用到了将数组的某一部分调整为一个堆,所以抽...原创 2018-08-15 21:17:40 · 210 阅读 · 0 评论 -
选择排序和其简单优化
以将一个数组排序为升序结果为例。综述:选择排序就是在排序时将数组分为一个有序序列和一个无序序列,每次从无序序列中选出最小的数(或者最大的数)放在有序序列的结尾(开头),这个有序序列是位于数组前部分(后部分),而在代码中表现为每次将无序序列中的最小元素(最大元素)和无序序列的第一个元素(最后一个元素)交换,因为有序序列和无序序列尾首相接(首尾相接)。 在上述文字括号中的是这个有序序列在...原创 2018-08-13 21:35:18 · 439 阅读 · 0 评论 -
LeetCode——第198题:验证二叉搜索树
题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3 输出: true 示例 2:输入: 5 / \ 1 4 ...原创 2018-07-31 18:50:40 · 1757 阅读 · 0 评论 -
LeetCode——第101题:对称二叉树
题目:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1 / \ 2 2 \ \ 3 3说明:如果你可以运用递归和迭代两种方法...原创 2018-07-31 18:49:16 · 561 阅读 · 0 评论 -
LeetCode——第19题:删除链表的倒数第N个节点
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?代码:package leetCode;原创 2018-07-23 10:16:18 · 260 阅读 · 0 评论 -
LeetCode——第206题:反转链表
题目:反转一个单链表。示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?代码:package leetCode;import leetCode.Nineteen.ListNode;...原创 2018-07-23 11:14:55 · 573 阅读 · 0 评论 -
LeetCode——第234题:回文链表
题目:请判断一个链表是否为回文链表。示例 1:输入: 1->2 输出: false示例 2:输入: 1->2->2->1 输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?进阶思考:反转再比较,反转用头插法。代码:package leetCode;import java.ut...原创 2018-07-23 18:36:40 · 484 阅读 · 0 评论 -
LeetCode——第21题:合并两个有序链表
题目:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4代码:package leetCode;import leetCode.TwoHundredAndThirtyFour.List...原创 2018-07-24 19:28:48 · 368 阅读 · 0 评论 -
LeetCode——第141题:环形链表
题目:给定一个链表,判断链表中是否有环。进阶:你能否不使用额外空间解决此题?代码:package leetCode;import java.util.HashMap;/** * * @author dhc * */public class OneHundredAndFourtyOne { class ListNode { ...原创 2018-07-25 19:13:00 · 347 阅读 · 0 评论 -
LeetCode——第题:求二叉树深度
题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ \ 9 20 / \ 15 7 返回它的最大深度 3 。代码:package leetCode;import...原创 2018-07-25 20:12:54 · 371 阅读 · 0 评论 -
LeetCode——第102题:二叉树的层次遍历
题目:给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7],3/ \ 9 20 / \ 15 7 返回其层次遍历结果:[ [3], [9,20], [15,7] ]代码:package leetCode;...原创 2018-07-25 20:46:57 · 1910 阅读 · 0 评论 -
LeetCode——第155题:最小栈
题目:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。示例:MinStack minStack = new MinStack(); minStack.push(-2); minStack....原创 2018-08-04 09:57:03 · 1419 阅读 · 0 评论 -
直接插入排序和其优化
综述:插入排序同选择排序一样,将数组分为两个序列,每次从无序序列中拿出第一个元素插入到有序序列中,正常情况是在插入时先找出插入位置,在移动元素,在将元素插入到正确的位置。对于选择排序的优化一种是可以减少查找插入位置的时间,利用二分查找;其实在这里可以将查找和移动插入写在一个循环中,循环时判断并且后移,到正确的位置时在插入元素,同时这里的移动元素和插入操作可以用元素交换来实现。对于合并两个循环和...原创 2018-08-13 21:43:18 · 445 阅读 · 0 评论