
算法
文章平均质量分 68
zhusf16
这个作者很懒,什么都没留下…
展开
-
不相邻问题
链式不相邻问题问题:有Σ:{1,2,3⋯n}\varSigma :\left\{ \text{1,2,}3\cdots n \right\} ,从Σ\varSigma中取出mm个数,并且此mm个数不能彼此相邻,试问有多少种取法。 这个问题在组合数学中有结论,也给出了证明,但是我没有足够的耐心把证明看完,自己用高中排列组合的知识导出了结果,供参考。如下方示意图所示, 第一步,将mm个球摆成一排放桌原创 2018-04-03 11:00:21 · 7539 阅读 · 3 评论 -
最大值队列、最大值栈
要求实现一个队列或栈,并且在O(1)的时间内,完成pop()、push()和max()的操作。1 最大值队列《剑指Offer》面试题59用一个正常的队列实现数据的插入和删除,满足FIFO的关系。用一个双向队列保存当前队列中的最大值,并且保证当前最大值始终位于双向队列的前端。如何维护这个双向队列呢?新数据插入时,将双向队列后部所有比新数据小的元素删除,因为这些元素不可能是未来的最大值了。...原创 2018-09-29 23:33:13 · 2340 阅读 · 0 评论 -
动态规划之背包问题
1. 一维背包问题0-1背包问题给定一个载重量为CCC的背包,有nnn个物品,每个物品的重量为wiw_{i}wi,每个物品的价值为viv_{i}vi,如何往背包中装物品使得背包中的总价值最大化。max  V=Σvixis.t.  Σwixi≤C     &a原创 2018-10-18 14:20:58 · 539 阅读 · 0 评论 -
二分查找及其变式
对于在有序的向量可以使用二分查找的方法,在log(n)log(n)log(n)的时间复杂度内完成查找。应当指出二分查找必须基于“有序”的前提条件。1 基本程序实现在一个数组中,查找一个数字的基本程序如下所示。int binary_search(const vector<int>& nums, int target) { // -1 means target doe...原创 2018-09-29 13:26:48 · 624 阅读 · 0 评论 -
动态规划思想
1. 动态规划与分治动态规划(Dynamic Programming, DP)方法常常被用来寻找最优解。类似于分治策略,将原问题分解为子问题,然后对子问题进行求解,再子问题的解综合得到原问题的解。但是用递归的算法实现分治策略时,往往和大量重复求解子问题,导致了指数级的时间复杂度。有两种方法可以避免重复求解子问题,一是在递归求解的过程中,将子问题的解记录下来,后续遇到相同子问题时,在常数时间内取出...原创 2018-10-13 12:22:57 · 364 阅读 · 0 评论 -
洗牌算法Fisher-Yates shuffle
LeetCode 519. Random Flip Matrix中碰到了如何随机地挑选矩阵中的一个元素的问题。实际上这题目的思路并不难想。原始算法step1:生成从0到所剩元素个数之间的随机数kkk;step2:从头开始开始遍历,找到第kkk个尚未取出的随机数,将该数取出,并将剩余元素的数量减一step3:重复step1,step2,直至所有元素均取出首先,所有元素被取出均...原创 2018-08-29 09:10:20 · 1374 阅读 · 0 评论 -
K选取问题
k选取是一个经典的算法问题,很多教科书和算法题都有该问题。找到无序的数组中第k小的数(此处约定最小值为第一小的数)。很容易想到将数组排序,然后取出下标为k-1的元素,该算法的时间复杂度为O(nlgn)O(nlgn)O(nlgn)。显然有更快的方法。大顶堆法一个大顶堆维护了弱序关系,堆顶为最大的元素。创建一个大顶堆,遍历数组,如果堆中的元素数量小于kkk,则继续向堆中添加元素;如果堆中的元素...原创 2018-08-05 14:07:14 · 1294 阅读 · 0 评论 -
划分(partition)算法
quicksort中的快速划分快速排序quicksort的核心是对无序向量进行快速划分,选取一个元素作为轴点(pivot)对向量进行划分,确保比轴点大的元素在轴点之后,比轴点小的元素在轴点之前,将原向量划分为两个子向量。算法思想: 1. 取一元素为轴点(pivot),不妨取首元素为轴点,并将轴点的值备份; 2. 从向量的起始(low)和末尾(high)同时进行扫描; 3. 若nums...原创 2018-06-28 09:44:01 · 10535 阅读 · 1 评论 -
如何判断整数是否是2、3、4的乘方(幂)
在LeetCode 342. Power of Four和LeeCode 326. Power of Three中有关于如何判断整数是否是4或者是3的乘方问题,并且不用循环和递归。如果使用循环或者递归可以很容易地通过不断地除以基数进行判断,如果要求不能使用循环或者递归,那该问题就有难度了。乘方数的重要性质:已知整数MMM是整数nnn的乘方即M=niM=niM=n^{i},若将MMM表示为n...原创 2018-06-26 14:03:10 · 854 阅读 · 0 评论 -
排序方法
1. O(n2)O(n^{2})O(n2)的排序方法1.1. 冒泡排序1.2. 选择排序2. O(nlg(n))O(nlg(n))O(nlg(n))的排序方法2.1 归并排序2.2 快速排序3. 非比较的排序方法3.1. 计数排序3.2. 桶排序一维数组的排序算法使用的场合很多,在许多面试中也经常被问到(虽然我还没有被问到过)。排序算法主要有插入排序、冒...原创 2018-10-10 08:55:33 · 417 阅读 · 0 评论