
algorithm
panyyer
Hello world
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【字符串系列】最长公共子序列(LCS)
LCS(longest common subsequent),暴力求解的复杂度为O(2^m*2^n),用dp求解的时间复杂度为O(m+n),本博文主要介绍LCS的dp求法,并且给出一点对应的模板题。 LCS的思想很简单,声明一个dp数组,用dp[i][j]表示一个长度为i的字符串和一个长度为j的字符串的LCS,很容易得到转移方程: dp[i,j]=⎧⎩⎨⎪⎪0dp[i−原创 2016-10-14 12:42:08 · 390 阅读 · 0 评论 -
求 TOPK 的三种方法及分析
从八大排序来说,适合求 topk 的排序有:冒泡、堆排、快排(有部分人觉得用快排左比较好,但是我不这么认为,利用快排思想求第K大是最好的,但是不太适合求前K大)冒泡(n*k):对于冒泡来说,求前k个数,只需要遍历k次即可,因此算法上有性能的提升堆排(nlogk):构造一个大小为 k 的堆,求前 k 大就构造最小堆(构造完之后,最小值如果小于当前值,则覆盖然后再调整一次堆),最前 k 小就构造最大堆(原创 2017-07-29 23:11:19 · 4685 阅读 · 0 评论 -
判断平衡二叉树(JAVA)
解法一:递归次数少,代码量不多public class Solution { public boolean IsBalanced_Solution(TreeNode root) { return getDepth(root) != -1; } public int getDepth(TreeNode node){ if(node == null)原创 2017-08-01 11:00:06 · 866 阅读 · 0 评论 -
折半查找【三种写法】
二分查找,又叫折半查找。网上有很多写法,但是经过总结之后常见的有这三种写法,根据不同情况使用不同写法,至于算法的思路请自行理清。 int bSearch(int begin, int end, int e) { int mi原创 2016-10-14 12:38:57 · 1069 阅读 · 0 评论 -
【字符串系列】字符串匹配(KMP)
KMP算法是一种字符串匹配算法,由三个老外发现的,因此算法就用三个老外名字首字母命名了。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 KMP算法的关键是next数组的求解,并根据实际情况next数组可以进行各种活用。 next数组是什么? 例如有一个字符串n,和一个字符串m,需要在n中匹配m,那么就需要对m进行next数组求解,原创 2016-10-27 15:52:14 · 364 阅读 · 0 评论 -
冒泡排序【改进】
冒泡排序是最简单的排序算法之一,在这里首先要说明的是一个要注意的地方。冒泡排序在最好情况下时间复杂度可以是o(n^2),也可以是o(n)。下面看一种大家看得最多的写法public void bubbleSort(int arr[]) { for(int i = 0, len = arr.length; i < len - 1; i++) { for(int j = 0; j原创 2017-04-08 23:21:17 · 298 阅读 · 0 评论 -
【字符串系列】最长上升子序列(LIS)
LIS(Longest increasing subsequence) 主要有O(nlogn)和O(n^2)两种解法,本博文主要介绍O(nlogn)解法,顺便提一下O(n^2)。 首先说一下O(n^2)解法的思路,假设一个数组a[n],定义dp[i]为以a[i]结尾的LIS的值,那么对于a[i],有dp[i]=max{dp[k],k∈[1,i-1]且a[k]}+1,迭代求解,dp[n]就原创 2016-10-14 12:46:30 · 407 阅读 · 0 评论 -
高效素数打表
#include #include #include #include #define maxn 10000000 bool visit[maxn+1000000]; int prime[maxn],n; ///prime的大小大概估计一下再开数组。大概是(x/lnx) void getprime() { memset转载 2017-03-28 22:07:16 · 249 阅读 · 0 评论 -
C语言求最小公倍数
首先,需要知道一个公式,最小公倍数=两整数的乘积/最大公约数。 最大公约数通过辗转相除求得,具体求法可以看我的博客,利用位操作,实际上一行代码即可求出最大公约数。 http://blog.youkuaiyun.com/qq_22497299/article/details/51922527 知道如何求最大公约数之后,只要知道公式,求最小公倍数就不在话下了。int lcm(int a, int b){原创 2016-10-14 12:49:39 · 2811 阅读 · 0 评论 -
一行代码求最大公约数(欧几里得算法)
本文要介绍的不是普通的欧几里德算法(辗转相除法),而是利用位操作实现的欧几里得算法。 利用位操作实现欧几里得算法主要有以下两个优点:1.代码量少 2.效率高。首先,欧几里德算法求最大公约数的做法是: ⒈ 令r为a/b所得余数(0 <= r < b) 若 r= 0,算法结束;b 即为答案。 ⒉ 互换:置 a←b,b←r,并返回第一步。int gcd(int a, int b){原创 2016-10-14 12:32:20 · 2186 阅读 · 0 评论