数据结构
ziyonghong
爱编程有追求的热血青年
展开
-
动态规划--最长递增子序列
已知一个序列 {S1, S2,...,Sn} ,取出若干数组成新的序列 {Si1, Si2,..., Sim},其中 i1、i2 ... im 保持递增,即新序列中各个数仍然保持原数列中的先后顺序,称新序列为原序列的一个 子序列 。 如果在子序列中,当下标 ix > iy 时,Six > Siy,称子序列为原序列的一个 递增子序列 。定义一个数组 dp 存...原创 2020-04-10 19:46:12 · 453 阅读 · 0 评论 -
数列的逆序对
一、暴力遍历法最从前向后依次统计每个数字与它后面的数字是否能组成逆序数对。用到了双循环,时间复杂度为O(N^2)。for (i = 0; i < len; i++){ for (j = i + 1; j < len; j++){ if (a[i] > a[j]) nCount++; }}二、归并排序法比如合并数列(1,3,5...原创 2020-04-03 11:31:32 · 535 阅读 · 0 评论 -
LeetCode中BFS总结
广度优先搜索的搜索过程有像一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个长度。实现 BFS 时需要考虑以下问题: 队列:用来存储每一轮遍历的节点; 标记:对于遍历过的节点,应该将它标记,防止重复遍历。 只能用来求解无权图的最短路径问题。 典型例题就是:计算在网格中从原点到特定点的最短路径长度 。leetcode102. Bin...原创 2020-03-15 23:20:47 · 567 阅读 · 0 评论 -
LeetCode中桶排序问题
桶排序原创 2020-03-04 23:06:53 · 980 阅读 · 0 评论 -
TopK问题之堆排序
堆排序用于求解 TopK Elements 问题,通过维护一个大小为 K 的堆,堆中的元素就是 TopK Elements。当然它也可以用于求解 Kth Element 问题,因为最后出堆的那个元素就是 Kth Element。 快速选择也可以求解 TopK Elements 问题,因为找到 Kth Element 之后,再遍历一次数组,所有小于等于 Kth E...原创 2020-03-01 20:59:53 · 288 阅读 · 0 评论 -
简单算法:冒泡排序与选择排序
1.冒泡法排序时,需要将数组中前后元素两两比较,如果符合if条件(大于或小于),则交换两个数,否则,比较下两个元素的大小,依次执行。执行一次循环,可以找到当前数组中最大(或最小)的一个元素,然后问题规模变小,继续同样的原理找出len-1个元素里的最大值,使之成为第二大元素,依次执行,需要在外层嵌套一层循环。2.选择排序则是用一个标志记录下循环一趟后的最小值或最大值,在与第1(2,3,4....原创 2018-05-19 10:39:52 · 251 阅读 · 0 评论 -
快速排序
快速排序的基本思路:选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,直到整个序列达到有序。整个快排的过程就ke简化可以一趟排序的过程,然后递归调用就行了。(注:递归过程一定要有出口,即递归结束条件)一趟排序的方法:1,定义i=0(low),j=A.lenght-1(high),i为...原创 2018-07-25 10:32:43 · 17938 阅读 · 9 评论 -
二分查找法
一、需查找和目标值相等的数比如数组 [2, 4, 5, 6, 9],target = 6,返回3,即target 的在数组中的位置。二分查找法的代码如下:int find(int[] nums, int target) { int left = 0, right = nums.length; while (left < right) { int mi...原创 2019-10-26 19:45:55 · 1905 阅读 · 1 评论 -
图解归并排序
核心思想:分治法,将已有序的子序列合并,得到完全有序的序列。1. 图解过程归并过程:合并两个有序数组:2.代码实现public static void mergeSort(int[] arr) { sort(arr, 0, arr.length - 1);}public static void sort(int[] arr, int L, int ...原创 2019-10-06 19:17:03 · 168 阅读 · 0 评论 -
遍历二叉树的递归解法与非递归解法
树结点定义:public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; }}前序遍历(根->左->右)递归解法:public static void pr...原创 2019-10-05 10:54:53 · 141 阅读 · 0 评论 -
数据库的索引实现--B+Tree
一上来就B+ Tree可能我也会一脸懵逼,那么植树节刚过,刚好来复习一下各种数吧~一、二叉查找树二叉查找树也称为二叉排序树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:1、任意节点左子树不为空,则左子树的值均小于根节点的值;2、任意节点右子树不为空,则右子树的值均大于于根节点的值;3、任意节点的左右子树也分别是二叉查找树;4、没有键值相等的节点;...原创 2019-03-17 20:05:17 · 310 阅读 · 0 评论 -
合并排序
合并排序是一种分而治之的思想。将待排序元素分成两半,分别对两半进行排序,最终将排好的两半又合并。实现代码如下:public class MergeSort { public static void mergeSort(int a[], int left, int right) { if (left < right) {// 至少有两个元素 int mid = (l...原创 2018-08-03 14:37:59 · 290 阅读 · 0 评论 -
数据结构之链表
链表也是一种线性表,它相比于数组的优势就是,可以动态分配存储空间,不用预先设定好大小,分配的内存空间也不用连续,只是像一条链子一样把每个节点串起来就可以了。那么每个节点就不不止包含了date还需要有指向下一个节点的next指针。因为链表这样的结构,所以插入和删除很方便,时间复杂度为O(1),不需要像数组一样移动大量数据.但查找数据是只能从head开始遍历,时间复杂度为O(n)。 链...原创 2018-11-03 17:09:30 · 304 阅读 · 0 评论