
经典算法
文章平均质量分 66
BoomHusky
计算机专业硕士,希望自己的实力能够更强
展开
-
经典算法 | 求长度为n数组中所有出现次数多于⌊ n/m ⌋的所有数的O(n)时间,O(1)空间算法
求数组中多于一半的或者是多于1/3的全部数字都可以用这种方法解决这里给你一个数组,要你求出所有出现数量多于 ⌊ n/3⌋的数字,这题方法简单,但是原理非常复杂,,首先用两个数a,b,n1,n2来分别记录峰1,峰2,峰1的数量,峰2的数量,可以证明,当求 所有多于⌊ n/m ⌋的数的时候,只要定义(m-1)个不同的数字,以及(m-1)个不同的计数,将所有计数初始化为0,所有数字初始化为不同值原创 2018-01-13 14:22:07 · 749 阅读 · 0 评论 -
经典算法 | 给定n个集合,求解一个范围,使得这个范围包含每个集合至少m个数
这题给你许多个数组,让你给出一个范围,这个范围里面包含每个数组至少一个数,并且使这个范围尽可能的小。使得这个范围里面包含每个数组至少m个数也可以适用相同的方法解决,只需要修改一个值就行了。这题是使用贪心算法的思想解决的。首先把所有数组里面的值都混合在一起,组成一个数组theMark,然后排序,混合之后的数组为pair类型的数组,pair第一个值表示得到的这个值属于几号数组,第二个值才真正表示假如混原创 2018-01-18 17:51:18 · 2257 阅读 · 0 评论 -
经典算法 | 求整数的全部质数因子分析与解答
有这么一道题:功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )最后一个数后面也要有空格 这一道题目让你找给定整数N的全部的质数因子。一般的人可能会考虑每一次遍历一遍2到N的全部的整数,找到一个质数因子a,然后N/=a,直到N等于1,但是这种方法其实就是暴力搜索,时间效率并不好其实有一种更好的方法,就是设定i=2,i一直递增,当N%i==0的...原创 2018-04-05 11:36:00 · 30337 阅读 · 7 评论 -
复数类n次方原理以及C#代码实现
完整代码下载https://download.youkuaiyun.com/download/u012737193/10359608我们这里将复数类表示为complx = real + imag * i那么要如何计算complex ^ n呢,这里的n是double类型,可以是任何数首先进行如下转换因此complex = r *(cos(mu)+ sin(mu)*i) = r*(e ^ (mu * i))(欧拉...原创 2018-04-19 11:12:16 · 2259 阅读 · 0 评论 -
经典算法 | 求解最大连续子段O(nlogn)时间复杂度的算法
传统的求某个序列的最长递增子序列的题目,假如使用一般的DP去做的话时间或达到O(n ^ 2),,要求使用O(nlog(n))的时间解决题目,因此我们需要考虑一种特殊的DP方法来解决题目定义一个数组Dp,假设数组里面有Dp[1 ~ n]的值,给定的数组为nums,Dp[1 ~ n]对应于nums[1 ~ m]的范围,Dp[i]的具体含义为,在nums[1~m]的范围取递增子序列,可以找到的所有长度为...原创 2018-05-01 13:16:35 · 1558 阅读 · 0 评论 -
优化算法 | SVM支持向量机和HOG方向梯度直方图基础原理分析
首先需要明白SVM(支持向量机)的原理SVM(支持向量机)分类器的原理是利用“分类超平面”来实现数据分类。在利用“分类超平面”对数据进行划分时,遵循“间距最大”原则。例如,将二维平面内的两组数据分类,可以确定很多个“分类超平面”,在二维维度下,超平面退化为一条直线:上图中使用绿线将蓝色圆圈和红色方块进行分类,可以有多种方式。那么根据SVM原理,哪一条线是最佳分类线呢?答案是,最佳分类线因该是距离蓝...原创 2018-05-16 09:19:53 · 1282 阅读 · 0 评论 -
经典算法 | 使用C++实现常用的六种排序方法
#include<iostream>using namespace std ; //num[0]作为哨兵,不使用,数组从1开始 //插入排序void InsertSort(int num[], int n){ int j; for(int i = 2 ; i <= n ; i++) { ...原创 2018-08-31 20:01:31 · 335 阅读 · 0 评论 -
经典算法 | 多个进程,每个进程需要某个资源m个,这种资源共有n个,问你最多有多少个这样的进程争夺这个资源,而不会发生死锁
假如有多个进程争夺一种资源,这个资源共有n个,每个进程需要这种资源m个,并且每个进程当得到某一个资源之后不会直到执行完成都不会释放这个占有的资源,只有这个进程的需求得到满足之后他才会执行完成,那么问最多有多少个这样的进程争夺这m个资源,一定不会发生死锁?其实这个问题的简化版本是哲学家问题,哲学家问题是说有n个餐具,每个哲学家需要2个餐具才能用餐,问最多可以有多少个哲学家,才能保证每个哲学家能够...原创 2018-09-01 12:32:30 · 12214 阅读 · 0 评论 -
经典算法 | 在旋转数组中查找数字K最优化方法
题目:把一个一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,给定一个K,输出K在旋转数组中的位置,如果K不存在输出-1思路,这一题最笨的方法是将数组遍历一遍,但是这样的平均时间复杂度为O(N),肯定不是最好的解法,有O(logn)的解法比这个更好,方法就是使用优化后的二分查找的方法。首先设定两个指针left,right,要求left永远指向...原创 2018-09-13 10:08:30 · 1034 阅读 · 0 评论 -
经典算法 | 给定一个有n个数的数组,里面每个数出现a次,有一个数出现b次,b小于a,求出这个数。
给定一个有n个数的数组,里面每个数出现a次,有一个数出现b次,b<a,求出这个数。这一题可以使用暴力求解,但是这样的话需要统计每个数出现的次数,空间复杂度为o(n),这里要求空间复杂度为O(1)这里可以使用二进制来解决每个int型除了符号位有32位,因此我们可以统计这n个数的每一位的值,将这些值相加,对于那些出现了a次的数而言,全部数的某一位相加必定是a的倍数,对于那个出现了b次...原创 2018-09-24 14:40:56 · 2645 阅读 · 0 评论 -
经典算法 | 二维树状数组
给定一个二维数组,给定两种操作,第一种,输入s x1 y1 x2 y2,表示查询二维数组中(x1,y1)到(x2,y2)这一段矩形中所有数的和,第二组操作为a x1 y1 value,表示将数组中num[x1][y1]的数加value,如何在最快的时间内得到结果这里可以使用二维树状数组,首先是lowBit(n),这个函数的功能是返回n最低位的1所代表的数的大小,比如5,其二进制为101,那...原创 2018-09-24 15:53:47 · 766 阅读 · 0 评论 -
经典算法 | n皇后问题易理解算法和最高效率算法分析
经典算法值n后问题,这题题给你一个n*n的棋盘,问你放置n个皇后共有多少种不用的放置方法,在任意一个皇后所在位置的水平、竖直、以及45度斜线上都不能出现皇后的棋子这是一个典型的回溯法框架,并且也是很简单的一个回溯法框架,比这个更简单的就只有字符串全排列问题了。这题使用深度优先遍历的回溯法解决,每一行只放一个皇后,每一列只放一个皇后,如何判断某个皇后是否和前面已经放置的皇原创 2018-01-03 16:37:11 · 3646 阅读 · 0 评论 -
经典算法 | 大数相乘,给定两个string表示的大数,输出相乘的结果,给定的数和结果都用字符串表示
大数相乘算法经常遇到的题吧,按照用笔做乘法的顺序去做大数相乘就好了,就是处理起来比较麻烦,也只是麻烦而已class Solution {public: string multiply(string num1, string num2) { if (num1 == "0" || num2 =="0") return "0"; int n1 = num1.s原创 2018-01-26 12:51:05 · 1176 阅读 · 0 评论 -
LeetCode | 391. Perfect Rectangle矩形覆盖难题
GivenN axis-aligned rectangles where N > 0, determine if they all together forman exact cover of a rectangular region.Eachrectangle is represented as a bottom-left point and a top-right point. Forex原创 2018-01-30 16:55:21 · 1090 阅读 · 0 评论 -
经典算法 | 给定n个矩形,判断这些矩形是否在不重合的情况下组成一个大矩形的算法
GivenN axis-aligned rectangles where N > 0, determine if they all together forman exact cover of a rectangular region.Eachrectangle is represented as a bottom-left point and a top-right point. Forex原创 2018-01-30 17:01:23 · 3216 阅读 · 1 评论 -
经典算法 | 判断任意长度链表是否有环的O(n)时间,O(1)空间算法
题目是判断链表里面是否有循环,可以使用快慢指针解决,实际上只要是判断循环的题目都可以使用快慢指针解决,慢指针每一次走一格,快指针每一次走两格,当快指针为null的时候肯定不存在循环了,当链表中有循环则一定有一次循环会使得快指针等于慢指针计算出环所需要的总步数为,慢指针走到循环入口处所需要的步数和这个时候快指针和慢指针的距离的和(因为在环里面慢指针每次走一步,快指针每次走两步,他们的距离每次原创 2018-01-16 12:59:34 · 1000 阅读 · 0 评论 -
经典算法 | 给定数轴上点,寻找一个点到其他点的距离之和最小
给你一个数轴上的许多个点,让你寻找一个点A,使得A到其他所有数轴上的点的距离之和最短 毫无疑问,当数轴上的点的数量是偶数的时候,A取在数轴上所有点按照其坐标排列,排在最中间的两个点中间, 当数轴上的点的数量是奇数的时候,A取这些所有点按照其坐标排列,排在最中间的点当取好A之后求所有点到其距离之和即可 代码如下class Solution {public: int m原创 2018-01-13 14:16:33 · 20350 阅读 · 2 评论 -
经典算法 | 字符串最小编辑距离分析与证明
所谓的求字符串的编辑距离就是给你两个字符串A和B,每次对A进行下列三个操作之一:1) 改变一个字符2) 删除一个字符3) 增加一个字符将A变成B所需要的最小步骤数就是AB之间的编辑距离。1如何使用笔算出AB之间的编辑距离首先分析AB的长度,对其中较短的字符串进行加0填充,使填充之后的字符串长度相等,并且保证填充后的字符串之间每一位尽可能的原创 2017-12-21 19:42:22 · 1763 阅读 · 0 评论 -
经典算法 | ford-fulkerson算法和edmonds-karp算法
Ford-fulkerson算法基本步骤:1) 置初始可行流2) 构造原网络的残流网络,在残流网络中找s-t的有向路径。(s为起点,t为终点),如果没有,算法得到最大流,结束算法,否者继续下一步。3) 根据残流网络中的s-t有向路径写出对应到原网络中的s-t增广路径。对于增广路径中的前向弧,置s(e) = u(e) – f(e)。对于反向弧,置s(e原创 2017-12-11 11:54:51 · 3360 阅读 · 0 评论 -
经典算法 | 计算几何 | 判断点是否在多边形内部两个算法
判断点P是否在多边形中时计算几何中一个非常重要基本的算法。方法一是:用带符号的三角形面积之和与多边形面积进行比较,这种算法由于使用浮点运算所以会带来一定的误差,首先取目标点和多边形任意一条边构成三角形,三角形的符号这样确定,假设以多边形每个顶点逆时针顺序为正方向,按照这个方向每条边都是一个向量,当目标点在多边形某条边向量左边时,目标点和这条边构成的三角形的面积为正,当目标点在多边形某条原创 2018-01-08 12:55:00 · 4554 阅读 · 0 评论 -
经典算法 | 使用DP求解数组中最长子序列的个数
这是一道最长子序列题,子序列中的每一个数在原序列中不一定是相邻的,这一点要注意,用dp 解决,用dp[i]记录最后一个数字为nums[i]的最长子序列长度,用count[i]记录最后一个数字为nums[i]的最长子序列个数,dp[i]=max(dp[j]+1),{j| j=0,1,2…i-1&&nums[j]count[i]=所有count[j]之和if(dp[j]+1==dp[i])原创 2018-01-17 11:59:52 · 665 阅读 · 0 评论 -
经典算法 | 求解数组中的4个数的和为指定数的所有组合
给你一个数,问你数组中的哪四个数的和为指定的target,这四个数不允许出现重复的数。这一题并不难,但是非常的复杂,首先设定一个i和j,遍历i和j之间的所有数,这个过程并难,但是剪枝比较复杂,并且为了防止出现重复的数,需要使用非常复杂的过滤函数首先需要对数组进行排序,实际上很多涉及到数组的题目都首先需要对数组进行排序,能够节省很多的时间,首先是if (nums[i] +nums[i原创 2018-01-17 13:21:14 · 4400 阅读 · 0 评论 -
经典算法 | 不用加号做加法
Calculate the sum of two integers a and b,but you are not allowed to use the operator + and -.Example:Given a = 1 and b = 2, return 3.Credits:Special thanks to @fujiaozhu foradding this proble原创 2018-02-01 20:18:01 · 475 阅读 · 0 评论 -
给定n个数组编号1~n,给定一个范围,使得这个范围包含第k个数组至少ak个数的算法
这题给你许多个数组,让你给出一个范围,这个范围里面包含每个数组至少一个数,并且使这个范围尽可能的小。包含第k个数组ak个数的算法解决方法和本题一模一样使得这个范围里面包含每个数组至少m个数也可以适用相同的方法解决,只需要修改一个值就行了。这题是使用贪心算法的思想解决的。首先把所有数组里面的值都混合在一起,组成一个数组theMark,然后排序,混合之后的数组为pair类型的数组,pa原创 2018-01-26 12:47:07 · 744 阅读 · 0 评论 -
经典算法 | 求两个排序好的数组中第k大的数优化方法
题目描述:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。当然你可以使用遍历,第一个数组长度为n第二个数组长度为m,那么你的方法时间复杂度为o(m +n),但是有更快的方法,时间复杂度接近于O(log(m +n)),接下来介绍这种方法。基本思路如下,首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt]到...原创 2018-09-20 15:33:25 · 2287 阅读 · 0 评论