数据结构与算法
coffee-123
这个作者很懒,什么都没留下…
展开
-
数据结构与算法之美(四)
一,拓扑排序如果 a 先于 b 执行,也就是说 b 依赖于 a,那么就在顶点 a 和顶点 b 之间,构建一条从 a 指向 b 的边。而且,这个图不仅要是有向图,还要是一个有向无环图,也就是不能存在像 a->b->c->a 这样的循环依赖关系。因为图中一旦出现环,拓扑排序就无法工作了。实际上,拓扑排序本身就是基于有向无环图的一个算法。public class Graph ...原创 2020-05-28 21:59:30 · 1364 阅读 · 0 评论 -
数据结构与算法之美(三)
一,红黑树平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。最先被发明的平衡二叉查找树是AVL 树,它严格符合我刚讲到的平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。但是很多平衡二叉查找树其实并没有严格符合上面的定义(树中任意一个节点的左右子树的高度相差不能大于 1),比如我们下面要讲的红黑树,它从根节点到各个叶...原创 2019-12-23 21:01:54 · 320 阅读 · 0 评论 -
数据结构与算法之美(二)
一,二分查找二分查找的非递归实现public int bsearch(int[] a, int n, int value) { int low = 0; int high = n - 1; while (low <= high) { int mid = (low + high) / 2; if (a[mid] == value) { re...原创 2019-12-02 21:25:06 · 732 阅读 · 0 评论 -
数据结构与算法之美(一)
一,数组数组删除元素时可以记录被删除的数据,等数组内存空间不够时一次性删除,这样减少了因删除导致的数据搬移。数组为什么从0开始数组越界:int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; ...原创 2019-12-02 21:24:56 · 1589 阅读 · 0 评论 -
玩转算法面试(八)栈,队列,优先队列
一,栈150. 逆波兰表达式求值根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: ...原创 2019-09-29 18:05:12 · 195 阅读 · 0 评论 -
玩转算法面试(九):贪心算法
455. 分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可...原创 2019-09-08 22:32:42 · 413 阅读 · 0 评论 -
玩转算法面试:(八)动态规划
动态规划将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。1,斐波那契数列(1)递归方法int fib(int n){ if(n == 0) return 0; if(n == 1) return 1; return fib(n - 1) + fib(n - 2);}...原创 2019-06-30 22:32:47 · 526 阅读 · 0 评论 -
玩转算法面试:(七)递归和回溯法
回溯问题可以转化成树形问题回溯法是暴力解法的一个主要手段17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].cla...原创 2019-09-04 22:09:33 · 576 阅读 · 0 评论 -
玩转算法面试:(六)二叉树和递归
111. 二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.class Solution {public...原创 2019-08-18 09:49:19 · 212 阅读 · 0 评论 -
玩转算法面试:(五)LeetCode链表类问题
206. 反转链表反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?class Solution {public: ListNode* reverseList(ListNode*...原创 2019-08-10 16:45:16 · 164 阅读 · 0 评论 -
玩转算法面试:(四)查找类问题
set 和 map:常见操作: insert find erase change (map) map和set的底层实现为红黑树unordered_map和unordered_set的底层实现为哈希表哈希表不管查找、插入、删除都是O(1)的时间复杂度。红黑树的时间复杂度为O(logn)。哈希表的缺点是失去了数据的顺序性数据的顺序性 数据集...原创 2019-07-23 00:11:50 · 271 阅读 · 0 评论 -
玩转算法面试:(三)LeetCode数组类问题
数组中的问题其实最常见。排序:选择排序;插入排序;归并排序;快速排序查找:二分查找法数据结构:栈;队列;堆1、二分查找法template<typename T>int binarySearch( T arr[], int n, T target ){ int l = 0, r = n-1; // 在[l...r]的范围里寻找target:前闭后闭...原创 2019-07-13 10:22:31 · 341 阅读 · 0 评论 -
vector实现
(1)push_back的时候均摊,时间复杂度还是o(1)template <typename T>class MyVector{private: T* data; int size; // 存储数组中的元素个数 int capacity; // 存储数组中可以容纳的最大的元素个数 // O(n):一重循环。 ...转载 2019-07-03 20:30:00 · 117 阅读 · 0 评论 -
简单递归函数算法复杂度分析
(1)计算x的n次方的幂运算double pow( double x, int n ){ assert( n >= 0 ); if( n == 0 ) return 1.0; double t = pow(x, n/2); //奇数 if( n%2 ) retu...转载 2019-07-03 19:48:11 · 1391 阅读 · 0 评论 -
排序算法总结
排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:1.冒泡排序思想:从后往前将数组中的元素两两比较,交换两者的位置取小的那一个元素,直到数组开头...原创 2019-07-07 19:30:56 · 461 阅读 · 1 评论 -
BitMap算法
所谓的BitMap就是用一个bit位来标记某个元素所对应的value,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。基本思想:我们用一个简单的例子来详细介绍BitMap算法的原理。假设我们要对0-7内的5个元素(4,7,2,5,3)进行排序(这里假设元素没有重复)。我们可以使用BitMap算法达到排序目的。要表示8个数,我们需要8位,即1个byte。 1.首先我...原创 2019-03-18 14:20:52 · 114 阅读 · 0 评论