随笔分类 - 算法分析与设计
经典算法,算法乃程序的灵魂所在,假如你掌握了算法中的其中一小点思想,那么你对程序的理解也会上升一个层面,写代码的时候也不会觉得的一头雾水。算法是前人经过数十年甚至几百年才参透的奥秘,你不要企图全部掌握,能知其一二此生便足以。
摘要:百度百科 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之
阅读全文
摘要:题目描述 给定一个 n×m 的方格矩阵,每个方格要么是空格(用 . 表示),要么是障碍物(用 * 表示)。 如果两个空格存在公共边,则两空格视为相邻。 我们称一个不可扩展的空格集合为连通分量,如果集合中的任意两个空格都能通过相邻空格的路径连接。 这其实是一个典型的众所周知的关于连通分量(Connec
阅读全文
摘要:题目描述 共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。 游戏遵循如下规则: 从第 1
阅读全文
摘要:题目描述 给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。 模板串 P 在模式串 S 中多次作为子串出现。 求出模板串 P 在模式串 S 中所有出现的位置的起始下标。 输入格式 第一行输入整数 N,表示字符串 P 的长度。 第二行输入字符串 P 。 第三行输入
阅读全文
摘要:一、基础算法 1、快排 1 public static void quickSort(int l, int r, int[] arr) { 2 if (l >= r) { 3 return; 4 } 5 int base = arr[(r - l) / 2 + l]; 6 int i = l - 1
阅读全文
摘要:题目描述 给定一个长度为 n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n ,表示数列的长度。 第二行包含n个整数,表示整个数列。 输出格式
阅读全文
摘要:介绍 这几天在打比赛时遇到了二维前缀和,看了一下深有体会,发一篇详解。首先,什么是前缀和?一个数列,我们要计算某个区间内的和,该怎么做呢?正所谓暴力出奇迹,这一个也可以,我们暴力枚举每一个区间内的数并且相加,可是这个是O(n)的时间复杂度,不要小看这个线性,可如果在DP里的话这相当于加了一次方,卡你
阅读全文
摘要:什么是最小生成树? 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 MST性质: 假设 N = (V, {E})是一个连通网,U是顶点集V的一个非空子集
阅读全文
摘要:题目描述: w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。 这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。 如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗? 输入
阅读全文
摘要:什么是二叉排序树? 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。 在算法设计中,往往需要有检索查找数据的操作,如果在数据量比较庞大的情况下用一般的数组或者链表之类的线
阅读全文
摘要:题目: 【问题描述】给定一个长度为 N 的数组 A = [A1, A2, · · · AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2, A3, · · · , AN。当修改Ai 时,小明会检查 Ai 是否在 A1 ∼ Ai−1 中出现过。如
阅读全文
摘要:简单介绍:希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959年提出而得名。希尔排序是把记录按下标的一定增量分组
阅读全文
摘要:题目描述: 有一个消息包含A-Z通过以下规则编码 'A' -> 1 'B' -> 2 ... 'Z' -> 26 现在给你一个加密过后的消息,问有几种解码的方式 样例 样例 1: 输入: "12" 输出: 2 解释: 它可以被解码为 AB (1 2) 或 L (12). 样例 2: 输入: "10"
阅读全文
摘要:什么是最长公共子序列? 最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序
阅读全文
摘要:什么是最大字段和? 问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<
阅读全文
摘要:什么是KMP算法? 1. 背景KMP算法一种改进的模式匹配算法,是D.E.Knuth、V.R.Pratt、J.H.Morris于1977年联合发表,KMP算法又称克努特-莫里斯-普拉特操作。它的改进在于:每当从某个起始位置开始一趟比较后,在匹配过程中出现失配,不回溯i,而是利用已经得到的部分匹配结果
阅读全文
摘要:什么是0-1背包问题? 对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0-1背包问题。 问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装
阅读全文
摘要:数学归纳法引出动态规划算法的思想 我们解决动态规划问题一般分为四步: 1、确定状态 2、转移方程 3、初始条件和边界情况 4、计算顺序 经典例题: 1、斐波拉契数列(自顶向下)递归版本 这个代码的时间复杂度是2^n,也就是指数递增,我们经过测试当求一个很大数字的时候,这个时间可想而知很长 1 pub
阅读全文
摘要:题目描述小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。输入描述输入的第一行包含一个整数 n (1≤n≤
阅读全文
摘要:题目: 问题描述w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗? 输入
阅读全文