数据结构&算法
文章平均质量分 94
排序、检索、dp、dfs、bfs等
码渔
学如逆水行舟,不进则退。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
力扣题解 - 简单题(1 ~ 500)
1. 两数之和class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> hashtable = new HashMap<>(); for (int i = 0; i < nums.length; ++i) { if (hashtable.containsKey(target - nums[i])) {原创 2020-12-26 15:13:04 · 1338 阅读 · 0 评论 -
二分查找算法
/** * 二分查找 * @param arr 查找数组 * @param left 左区间 * @param right 右区间 * @param val 查找值 * @return 第一个不小于val的值的位置 */public static int BinarySearch(int[] arr, int left, int right, int val) { while (left < right) { int mid = left + (right -原创 2020-10-16 10:51:00 · 244 阅读 · 0 评论 -
你想了解的所有树结构,都收集在这篇文章里了
一、二叉查找树1.1 定义一颗二叉查找树(BST)是一颗二叉树,其中每个结点都含有一个 Comparable 的键(以及相关联的值)且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点的键。1.2 基本实现树结点类:public class TreeNode { Integer key; // 键 Integer val; // 值 TreeNode left; // 左子树 TreeNode right; // 右子树 TreeNode(原创 2020-08-28 16:43:03 · 13934 阅读 · 0 评论 -
查找算法
二分查找public class BinarySearch { public static int rank(int key, int[] a) { int lo = 0; int hi = a.length - 1; while (lo < hi) { int mid = lo + (hi - lo) / 2; if (key < a[mid]) hi = mid - 1;原创 2020-08-23 12:57:53 · 13539 阅读 · 0 评论 -
TimSort 排序 - 简易版
一、简易版本TimSort排序算法原理与实现TimSort 排序算法是 Python 和 Java 针对对象数组的默认排序算法。TimSort排序算法的本质是归并排序算法,只是在归并排序算法上进行了大量的优化。对于日常生活中我们需要排序的数据通常不是完全随机的,而是部分有序的,或者部分逆序的,所以 TimSort 充分利用已有序的部分进行归并排序。现在我们提供一个简易版本 TimSort 排序算法,它主要做了以下优化:1.1 利用原本已有序的片段首先规定一个最小归并长度。检查数组中原本有序的片段,如原创 2020-08-21 16:10:14 · 13897 阅读 · 0 评论 -
十大经典排序算法 - Java实现
冒泡排序基本思想:两两比较相邻记录的关键字,如果是反序则交换,直到没有反序的记录为止。public void swap(int[] a, int x, int y) { a[x] = a[x] ^ a[y]; a[y] = a[x] ^ a[y]; a[x] = a[x] ^ a[y];}public void BubbleSort(int[] a) { for (int i = 0; i < a.length; i++) { for (int原创 2020-08-12 10:25:49 · 13538 阅读 · 0 评论 -
案例研究:union-find(并查集) 算法
一、问题提出动态连通性问题:问题的输入是一列整数对,其中每个整数都表示一个某种类型的对象,一对整数 p q 可以被理解为 “p 和 q 是相连的”。我们假设 “相连” 是一种等价关系,这也就意味着它具有:自反性:p 和 q 是相连的。对称性:如果 p 和 q 是相连的,那么 q 和 p 也是相连的。传递性:如果 p 和 q 是相连的且 q 和 r 是相连的,那么 p 和 r 也是相连的。对等关系能够将对象分为多个等价类。在这里,当且仅当两个对象相连时它们才属于同一个等价类。我们的目标是编写原创 2020-08-05 14:41:34 · 13637 阅读 · 0 评论 -
字典树 - 核心思想及其代码实现
一、简介trie 树也称为字典树、单词查找树,最大的特点就是共享字符串的公共前缀来达到节省空间的目的。例如,字符串 “abc” 和 “abd” 构成的 trie 树如下:字典树的根节点不存任何数据,每整个分支代表一个完整的字符串。像 abc 和 abd 有公共前缀 ab,所以我们可以共享节点 ab。如果再插入 abf,则变成这样:如果我再插入 bc,则是这样(bc 和其他三个字符串没有公共前缀)那如果再插入 “ab” 这个字符串呢?每个分支的内部可能也含有完整的字符串,所以我们可以对于那原创 2020-08-04 11:34:04 · 16262 阅读 · 0 评论 -
LeetCode刷题 - 算法小技巧
一、巧用数组下标数组的下标是一个隐含的很有用的数组,特别是在统计一些数字,或者判断一些整型数是否出现过的时候。例如,给你一串字母,让你判断这些字母出现的次数时,我们就可以把这些字母作为下标,在遍历的时候,如果字母a遍历到,则arr[a]就可以加1了,即 arr[a]++;通过这种巧用下标的方法,我们不需要逐个字母去判断。我再举个例子:问题:给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。对于这道原创 2020-07-23 16:32:02 · 13568 阅读 · 0 评论 -
跳跃表 - 核心思想及其代码实现
假如我们要用某种数据结构来维护一组有序的int型数据的集合,并且希望这个数据结构在插入、删除、查找等操作上能够尽可能着快速,那么,你会用什么样的数据结构呢?数组一种很简单的方法应该就是采用数组了,在查找方面,用数组存储的话,采用二分法可以在 O(logn) 的时间里找到指定的元素,不过数组在插入、删除这些操作中比较不友好,找到目标位置所需时间为 O(logn) ,进行插入和删除这个动作所需的时间复杂度为 O(n) ,因为都需要移动移动元素,所以最终所需要的时间复杂度为 O(n) 。例如对于下面这个数组原创 2020-07-23 15:58:33 · 13442 阅读 · 0 评论 -
递归
一、递归的三大要素1.1 第一要素:明确递归函数功能对于递归,我觉得很重要的一个事就是,这个函数的功能是什么,他要完成什么样的一件事,而这个,是完全由你自己来定义的。也就是说,我们先不管函数里面的代码什么,而是要先明白,你这个函数是要用来干什么。例如,我定义了一个函数:// 算 n 的阶乘(假设n不为0)int f(int n){}这个函数的功能是算 n 的阶乘。好了,我们已经定义了一个函数,并且定义了它的功能是什么,接下来我们看第二要素。1.2 第二要素:寻找递归结束条件所谓递归,就原创 2020-07-22 11:18:16 · 13272 阅读 · 0 评论
分享