
算法
K. Bob
多读书,多睡觉;少吃零食,多运动。
展开
-
DAG以及任务调度
有向无环图 图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。图的遍历主要有两种算法:BFS和DFS。 对于任何有向无环图(DAG)而言,其拓扑排序为其所有结点的一个线性排序(同一个有向图可能存在多个这样的结点排序)。该排序满足这样的条件——对于图中的任意两个结点U和V,若存在一条有向边从U指向V,则在拓扑排序中U一定出现在V前面。通俗来...原创 2019-12-07 21:49:16 · 11334 阅读 · 0 评论 -
查找算法
顺序查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找顺序查找 顺序查找适合于存储结构为顺序存储或链接存储的线性表。基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。 复杂度分析:查找成功时的平均查找长度为:(假设每个数据元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;当查找不成功时,需要n原创 2020-06-01 21:11:18 · 370 阅读 · 0 评论 -
手撕生产者-消费者模式 | P问题、NP问题
研究P/NP问题的原因: 因为计算机处理的输入常常不是那么几十个几千个那么一点点,想象一下,当计算机处理的数据达到100万个的时候,时间复杂度为o(n^ 2)和o(e^ n)的算法,所需的运行次数简直是天壤之别,o(e^n)指数级的可能运行好几天都没法完成任务,所以我们才要研究一个问题是否存在多项式时间算法。而我们也只在乎一个问题是否存在多项式算法,因为一个时间复杂度比多项式算法还要复杂的算法研究起来是没有任何实际意义的。P类问题:存在多项式时间算法的问题。(P:polynominal,多项式)NP原创 2020-05-18 23:20:59 · 416 阅读 · 0 评论 -
TSP
旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。一般分2大类:完全图:两两城市间都有直达的路线,这条路线不需要经过中间其他节点...原创 2020-04-29 00:10:06 · 301 阅读 · 0 评论 -
LeetCode—字符串处理
计算器224.基本计数器实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。class Solution { public int calculate(String s) { int res=0,sign=1; Stack<Integer> stack=...原创 2020-04-17 16:06:06 · 442 阅读 · 0 评论 -
递归/动态规划/迭代/贪心
基本概念递归:程序调用自身的编程技巧称为递归,是函数自己调用自己。一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或函数里面调用自身;2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.递归分...原创 2020-04-15 13:42:32 · 448 阅读 · 0 评论 -
十大经典排序算法
冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。1.1 算法描述步骤1: 比较相邻的元素。如果第一个比第二个大,就交换它们两个;步骤2: 对每一对相...原创 2020-04-11 00:24:15 · 371 阅读 · 0 评论 -
LeetCode——堆
接雨水42.接雨水(Stack)407.接雨水II(PriorityQueue)Kth问题703.数据流中的第K大元素378.有序矩阵中第K小的元素215.数组中的第K个最大元素692.前K个高频单词347.前K个高频元素丑数264.丑数II313.超级丑数其他864.获取所有钥匙的最短路径(广度优先遍历,用三维数组代替之前的used数组)818.赛车(动态规划/Dij...原创 2020-02-23 19:07:24 · 263 阅读 · 0 评论 -
LRU
LRU(Least Recently Used)是一种常见的页面置换算法,在计算中,所有的文件操作都要放在内存中进行,然而计算机内存大小是固定的,所以不可能把所有的文件都加载到内存,因此需要制定一种策略对加入到内存中的文件进项选择。 LRU的设计原理:当数据在最近一段时间经常被访问,那么它在以后也会经常被访问。这就意味着,如果经常访问的数据,需要其能够快速命中,而不常访问的数据,在容量超出...原创 2020-02-07 16:07:48 · 385 阅读 · 0 评论 -
LeetCode——Slinding Window
1074.元素和为目标值的子矩阵数量480.滑动窗口中位数3.无重复字符的最长子串1040.移动石子直到连续II1004.最大连续1的个数III76.最小覆盖子串424.替换后的最长重复字符567.字符串的排列1052.爱生气的书店老板239.滑动窗口最大值992.K个不同整数的子数组978.最长湍流子数组...原创 2020-01-16 00:26:48 · 343 阅读 · 0 评论 -
剑指Offer刷题记录(完结撒花)
前言:在刷了LeetCode之后,再来刷剑指会感觉很简单~【1】输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。public class Solution { public int TreeDepth(TreeNode root) { if(root==null) return 0; ...原创 2019-12-25 16:54:24 · 579 阅读 · 0 评论 -
LeetCode——并查集
并查集的具体实现细节可参见:并查集及其应用,大多数的并查集的题目都可用一个板子解决。200.岛屿数量(可用DFS/BFS/并查集)399.除法求值原创 2019-12-25 14:30:21 · 583 阅读 · 0 评论 -
LeetCode——回溯
套路题46.全排列(通过设定一个visited[]数组,解放判断,无脑从头开始就行,无序考虑index)47.全排列II(与46不同,含有重复数组,首先需要进行排序,借助于有序数组对重复元素进行剪枝)39.组合总和(由于可以复用元素,因此将visited数组用index代替)40.组合总和II78.子集(index)90.子集II(排序,index+used[]数组)其他93.复原...原创 2019-12-24 16:34:44 · 329 阅读 · 0 评论 -
LeetCode——二分法
300.最长上升子序列(DP+二分查找->O(N)=NlogN)658.找到K个最接近的元素原创 2019-12-23 15:05:53 · 445 阅读 · 0 评论 -
LeetCode——分治
“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序)分治法所能解决的问题一般具有以下几个特征:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性...原创 2019-12-22 17:32:11 · 331 阅读 · 0 评论 -
LeetCode——Stack
用栈处理括号嵌套问题385.迷你语法分析器341.扁平化嵌套列表迭代器括号问题20.有效的括号22.括号生成1003.检查替换后的词是否有效栈的设计155.最小栈225.用队列实现栈232.用栈实现队列下一个更大的元素496.下一个更大的元素I503.下一个更大的元素II739.每日温度单调栈(*该方法在笔试中经常用到)1124.表现良好的最长时间段(前缀和+单调栈...原创 2019-12-21 22:36:16 · 750 阅读 · 0 评论 -
LeetCode——BFS
DFS与BFS可结合起来理解,大多题目DFS与BFS均可解答。参见:LeetCode——DFS其他994.腐烂的橘子1091.二进制矩阵中的最短路径1162.地图分析787.K站中转最便宜的航班279.完全平方数127.单词接龙752.打开转盘锁...原创 2019-12-21 16:45:00 · 545 阅读 · 0 评论 -
LeetCode——DFS
岛屿问题200.岛屿数量(染色)130.被围绕的区域(染色边界岛屿,再遍历)695.岛屿的最大面积733.图像渲染463.岛屿的周长并查集547.朋友圈721.账户合并684.冗余连接494.目标和回溯491.递增子序列473.火柴拼正方形课程表207.课程表210.课程表II其他394.字符串解码743.网络延迟时间(Dijkstra)934.最短的桥(D...原创 2019-12-20 22:22:43 · 439 阅读 · 0 评论 -
LeetCode——二叉树
右问题199.二叉树的右视图(BFS/DFS)116.填充每个节点的下一个右侧节点指针(BFS)117.填充每个节点的下一个右侧节点指针II(借助于First和Last指针)序列化二叉树449.序列化和反序列化二叉搜索树652.寻找重复的子树606.根据二叉树创建字符串N叉树589.N叉树的前序遍历590.N叉树的后序遍历429.N叉树的层序遍历559.N叉树的最大深度构...原创 2019-12-20 01:03:43 · 391 阅读 · 0 评论 -
LeetCode——链表
反转链表206.反转链表92.反转链表II快慢双指针234.回文链表(寻找中点用快慢双指针法)19.删除链表的倒数第N个节点876.链表的中间结点(快慢双指针)龟兔赛跑问题141.环形链表142.环形链表II160.相交链表两数相加2.两数相加445.两数相加II链表排序21.合并两个有序链表148.排序链表(归并排序)147.对链表进行插入排序143.重排链表...原创 2019-12-18 18:03:07 · 345 阅读 · 0 评论 -
八皇后问题(回溯问题)
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。分析:其实该问题并不难,利用递归方法很容易解决。没放置一个皇...原创 2019-12-12 21:59:44 · 535 阅读 · 0 评论 -
LeetCode——数组
N数之和1.两数之和(HashMap一次遍历,时间复杂度O(N))15.三数之和(排序+双指针)16.最接近的三数之和(排序+双指针)18.四数之和(排序,递归+双指针)454.四数相加II(查找表)前缀和974.和可被K整除的子数组类Trie792.匹配子序列的单词数单调栈单调栈应用范围:求解数组中元素右边第一个比它小的元素的下标,从前往后,构造单调递增栈;求解数组中元...原创 2019-12-09 17:13:08 · 881 阅读 · 0 评论 -
常见数据结构-TrieTree/线段树/TreeSet
Trie/线段树/TreeSet线段树线段树 线段树是一种非常灵活的数据结构,它可以用于解决多种范围查询问题,比如在对数时间内从数组中找到最小值、最大值、总和、最大公约数、最小公倍数等。数组 A[0,1,\ldots,n-1]A[0,1,…,n−1] 的线段树是一个二叉树,其中每个节点都包含数组的一个子范围 [i\ldots j][i…j] 上的聚合信息(最小值、最大值、总和等),其左、右...原创 2019-12-02 20:01:33 · 666 阅读 · 0 评论 -
LeetCode——DP
将分门别类的对常见DP问题进行总结,文末附有GitHub链接字符串问题股票问题最长子序列问题0-1背包问题两个人抓数问题视频拼接问题零钱兑换问题字符串问题回文子串是连续的,而子序列则不一定连续。5.最长回文子串647.回文子串516.最长回文子序列股票问题121.买卖股票的最佳时机122.买卖股票的最佳时机II123.买卖股票的最佳时机III188.买卖股票的最佳时机IV30...原创 2019-11-19 20:37:31 · 378 阅读 · 0 评论 -
并查集及其应用
并查集 并查集(Union-Find)是解决动态连通性问题的一类非常高效的数据结构。 这里以整数 0~9 表示图中的10个点,然后给出两两连通的数据如下:[(4, 3), (3, 8), (6, 5), (9, 4), (2, 1), (8, 9), (5, 0), (7, 2), (6, 1), (6, 7)]。如何让计算机读取这些数据来构建一种数据结构(合并连通点),然后在这种数据结构...原创 2019-10-12 20:45:49 · 704 阅读 · 0 评论 -
深度优先搜索(DFS)和广度优先搜索(BFS)
笔试题中经常会出现DFS和BFS两种类型的题深度优先搜索DFS广度优先搜索BFSDFS与BFS对比 搜索算法简而言之就是穷举所有可能情况并找到合适的答案,所以最基本的问题就是罗列出所有可能的情况,这其实就是一种产生式系统。将所要解答的问题划分成若干个阶段或者步骤,当一个阶段计算完毕,下面往往有多种可选选择,所有的选择共同组成了问题的解空间。从根开始计算,到找到位于某个节点的解,深度优先搜索作为...原创 2019-08-29 19:15:22 · 1164 阅读 · 0 评论 -
堆排序与PriorityQueue
在做leetcode时碰到了应用PriorityQueue,巩固一下相关知识堆PriorityQueue堆 堆是一种非线性结构,可以把堆看作一个数组,也可以被看作一个完全二叉树。堆其实就是利用完全二叉树的结构来维护的一维数组,按照堆的特点可以把堆分为大顶堆和小顶堆。堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素。 大顶堆:每个结点的值都大于或等于其左...原创 2019-08-22 16:35:07 · 1549 阅读 · 0 评论 -
一致性hash算法
一致性Hash算法的理解一致性哈希算法基本原理一致性哈希算法解决数据倾斜策略 一致性Hash算法在分布式系统中得到了广泛应用。一个分布式的存储系统,要将数据存储到具体的节点上。如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移;如果是分布式缓存则其他...原创 2019-05-27 11:42:11 · 1417 阅读 · 0 评论