![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 52
奔跑的小河
从博客中来,到博客中去。
展开
-
【结构之法】二叉树中节点的最大距离
前言:编程之美中的解法并不是最好的,所以这里给出大神的解法。问题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义”距离”为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 思路计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。 情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,原创 2015-10-16 12:49:39 · 611 阅读 · 0 评论 -
【动态规划】硬币面值组合(上台阶)
问题1分2分5分的硬币三种,组合成1角,共有多少种组合?有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,有多少中组合可以组成n分钱?一个人上台阶可以一次上1个,2个,或者3个,问这个人上n层的台阶,总共有几种走法? 问法不一样,但是本质一样!解析实现总结原创 2015-10-30 12:41:18 · 8235 阅读 · 4 评论 -
【动态规划】最小硬币面值组合
问题给出硬币种类,及要组合的sum,求用最少的硬币数目到达sum。 如:硬币种类1,5,8 sum为20,则最少的硬币数目为5555。解析动态规划解法: dp[i]表示用N种硬币组合成i大小的最少硬币数目。 状态转移方程: dp[i] = min{dp[i-arr[j]] + 1 | 0<=j<=arr_len && arr[j]<=i , dp[i]}. dp[0] = 0;实现mems原创 2015-10-30 12:55:12 · 2516 阅读 · 0 评论 -
【算法】Fibonacci解法总结
我这里说的Fibonacci数列不仅仅是f(n-1) + f(n-2)的情况,也可以是f(n-1) + f(n-2) + … + f(n-k)的情况。但是这里我们用f(n-1) + f(n-2)来进行讨论,简化理解,举一反三。解法一,递归实现非常简单。int fibonacci(int i){ if(i==0){ return 0; }else if(i==1){原创 2015-10-30 13:10:40 · 918 阅读 · 0 评论 -
【数字之魅】寻找最大的K个数(求第k大的数)
前言:编程之美上并没有给出实际的代码,这里我参考yoona博主的做法自己也写了一遍,并记录下来。 与此相似的题目是: - 求第k大的数 - 求第k小的数 这里给出比较好的两个做法,分别是快排思想和堆思想。快排思想解堆思想解原创 2015-10-12 11:53:16 · 1731 阅读 · 0 评论 -
数字之魅——小感小悟
求二进制中1的个数查看网友评论有这样一句话:一个分支判断会耗上14个左右的时钟周期。 这里我就联想到了我看CSAPP中的几个知识点。现在CPU一般都是一条指令一个时钟周期普通线程之间的切换需要消耗20000个时钟周期,但是在现在cpu中基本都是超线程的,比如我笔记本是酷睿i5,2个实际内核,4个逻辑内核。也可以说是2房间4个门吧。在这种超线程的cpu中,线程切换只需要1个时钟周期。 上面只是原创 2015-07-26 16:50:53 · 838 阅读 · 0 评论 -
数字之魅——寻找发帖水王
寻找发帖水王这个题目给了我很大的启发,同时开阔了视野,往往在解决这类型问题的时候第一想法都是先排序再计算。而本题却给出了一个非常好的思路,时间复杂度为O(N)。它还有一个扩展问题,但是我在网上看了几篇有的写的考虑不周全,有的写的逻辑不是很清楚,这里我也根据思考和查阅,给出我自己的解法。typedef int Type; //给出Id的一个抽象Type candidate[3] = {0}; //说原创 2015-07-26 16:14:35 · 790 阅读 · 0 评论 -
LeetCode之4Sum(经典)
题目:Given an array S of n integers, are there elements a,b,c, and d in S such that a+b+c+d = target?Find all unique quadruplets in the array which gives the sum of target.Note:• Elements in a q原创 2015-06-07 17:06:48 · 975 阅读 · 0 评论 -
LeetCode之Remove Duplicates from Sorted Array
描述1.Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.2.Do not allocate extra space for another array, you must do this in plac原创 2015-04-06 17:17:53 · 313 阅读 · 0 评论 -
LeetCode之RemoveDuplicates扩展
题目:Follow up for ”Remove Duplicates”: What if duplicates are allowed at most twice? For example, Given sorted array A = [1,1,1,2,2,3], Your function should return length = 5,原创 2015-04-07 21:04:04 · 673 阅读 · 0 评论 -
【动态规划】完全背包、多重背包
完全背包问题解析实现多重背包问题解析实现原创 2015-10-30 00:17:49 · 680 阅读 · 0 评论 -
【动态规划】0-1背包问题
一、问题有N件物品和一个容量(最大承重)为V的背包。第i件物品的体积(重量)是w[i],价值是p[i]。求解将哪些物品装入背包可使价值总和最大。 所谓01背包,表示每一个物品只有一个,要么装入,要么不装入。二、分析0-1背包属于求最优解,当然用动态规划解决,当然也可以用其他方法解决。这里介绍动态规划方法。 阶段是:在前N件物品中,选取若干件物品放入背包中; 状态是:在前N件物品中,选取若干件物原创 2015-10-08 23:42:37 · 713 阅读 · 0 评论 -
【动态规划】交错重排
问题两个字符串,不改变原顺序,能否组成目标字符串。 eg: str1:ABC str2:123 aim:A12BC3、123ABC、1A2B3C、………解法动态规划解: dp[i][j]表示str1[0…i-1]和str2[0…j-1]能否组成aim[0…i+j-1]长度的字符串. 状态转移方程: dp[0][j] = str2[0…j] == aim[0…j] ? 1:0 dp[i原创 2015-10-29 21:06:31 · 486 阅读 · 0 评论 -
【算法】求n的m次方(快速幂取模)
题目求n的m次方,n,m均为自然数。解析看似简单的题目,但是要想写的高效还不是那么容易想出来。实现unsigned int power(unsigned int a, unsigned int n){ unsigned int i, s; if (!n) return 1; if(!a) return 0; i=n;s=a; while (i>>=1)//每原创 2015-10-14 22:49:32 · 9026 阅读 · 4 评论 -
动态规划概念
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那原创 2015-09-30 20:29:23 · 534 阅读 · 0 评论 -
【动态规划】求最长公共子串,最长回文子串
题目 : 给定两个字符串,求出它们之间连续的最长的相同子字符串的长度。 eg : fbaabe,ebaabf,连续最长子串长度为4。注意:求最长回文子串也可以用求最长公共子串来求,只需将字符串反转作为另外一个字符串,回文部分反转之后不变,然后求LCS(Longest common substring)即可。求最长公共子串通常两种方法:第一暴力,第二,动态规划。这里分别给出。1. ...原创 2015-09-30 20:46:54 · 721 阅读 · 0 评论 -
【动态规划】求一维子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如,输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 思路:设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以...原创 2015-09-30 20:43:39 · 1486 阅读 · 0 评论 -
【动态规划】求二维数组从左下到右上的最优路径
1.求二维数组从左下到右上的最优路径,使得路径和最大,并且只能向上或向下走。 解析:求最短路径,路径和最优等都可以用动态规划做。 dp[i][j]表示到i,j坐标的最优路径。 第一,确定初始条件。即向上向左的最优路径确定 dp[i,0] = dp[i-1,0] + arr[i][0] where j =0 dp[0,j] = dp[0,j-1] + arr[0][j] where i =原创 2015-09-30 20:41:58 · 4968 阅读 · 0 评论 -
【动态规划】求最长公共子序列
最长公共子串和最长公共子序列的区别: 最长公共子串和最长公共子序列的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。题目:求两个字符串中的最长公共子序列。 比如: string s1 = “ABCBDAB”; string s2 = “BDCABA”;它们的lcs是:BCB原创 2015-09-30 20:45:43 · 741 阅读 · 0 评论 -
【动态规划】最长递增子序列
题目:求一个无序数组中最长的递增子序列。例如: 1,3,2,5,4,6的最长递增子序列的长度是4。12446和1346。解析:直接给出动态规划的解,dp[i]表示以arr[i]结尾的最长递增子序列的长度。dp[0] = 1dp[i] = max{dp[0]...dp[i-1]} where arr[i] > arr[0...i-1] 代码:原创 2015-10-04 21:07:50 · 592 阅读 · 0 评论 -
【算法】判断二叉树是否是平衡二叉树
某个节点的左右子树相差不超过1原创 2015-10-11 15:59:20 · 677 阅读 · 0 评论 -
【动态规划】求二维数组走法路径种数
问题给定二维数组,从左上走到右下的走法种树,数组中1代表该格可以走,0代表不能走。且只能向下和向右走。解法典型的动态规划问题:dp[i][j]表示从[0][0]到[i][j]的走法数量。状态转移方程:dp[0][j] = 1 where i = 0dp[i][0] = 1 where j = 0dp[i][j] = dp[i-1][j] + dp[i][j-1] where arr[i]原创 2015-10-29 20:51:36 · 4332 阅读 · 0 评论 -
【算法】九大排序算法总结
九大排序算法这里我不采用数组来进行排序,而是采用更加符合应用的数据结构来排序。这是一种简单描述,更加详细的数据机构应该是下面这样(但是为了方便描述还是使用上面的简单结构):原创 2015-10-12 12:07:47 · 726 阅读 · 0 评论