算法
文章平均质量分 94
CarmenIsOK
这个作者很懒,什么都没留下…
展开
-
KMP模式匹配算法
一、KMP模式匹配算法符号说明i主串当前位置的下标(不回溯)j模式串T当前位置的下标目的:原本的匹配时 i 和 j 不停的回溯,KMP模式匹配让 i 不用回溯。j 值的变化与主串无关,取决于模式串T的结构中是否有重复(即当前字符之前的串的前后缀的相似度)。我们把模式串T各个位置的 j 值的变化定义为一个数组 Next,那么Next的长度就是模式串T的长度。...原创 2020-02-03 23:27:54 · 650 阅读 · 0 评论 -
查询大数据
如何判断在40亿个无符号整型数据是否存在某个数(不需要排序)?方案1申请512M的内存(232/8=512M),一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应的bit位是否为1,为1表示存在,为0表示不存在。方案2因为232为40亿多,所以给定一个数可能在,可能不在,这里把40亿个数中的每一个用32位的二进制来表示。假设这40...原创 2019-11-13 21:03:45 · 972 阅读 · 0 评论 -
交换两个整型变量,不需要额外空间
一、加减法例子:int a,b;a=10;b=8;a=b-a;//-2b=b-a;//即是b-(b-a)=b-b+a=a=10 a=a+b;//a=(b-a)+a=b=8int a,b;a=10;b=8;a=a+b;//18b=a-b;//即是b=a+b-b=a=10a=a-b;//a=a+b-b=a+b-a=8二、位运算例子 int a=10,b=12; //a=...原创 2019-11-13 17:56:17 · 235 阅读 · 0 评论 -
2019年vivo秋招笔试(第三题)
leetcode 546.移除盒子给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。当你将所有盒子都去掉之后,求你能获得的最大积分和。示例 1:输入:[1, 3, 2, 2, 2, 3, 4, 3, ...转载 2019-09-12 21:29:44 · 870 阅读 · 0 评论 -
插入排序及其时间复杂度、代码(c++实现)、改进和应用场景
插入排序插入排序的思想:检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。插入排序是稳定的非线性排序算法。从第一个元素开始,该元素可以认为已经被排序,该序列称为Done取出下一个元素,在已经排序的元素序列Done中从后...原创 2019-07-28 20:37:23 · 555 阅读 · 0 评论 -
计数排序及其时间复杂度、代码(c++实现)、应用场景
计数排序计数排序是一种非基于比较的排序算法。基本思想是:用空间换时间,本质上是建立了基于元素的Hash表。1、时间复杂度时间与空间复杂度均为O(n)。基于比较的排序算法时间复杂度最小是O(nlogn)的。计数排序、桶排序与基数排序都是线性排序。...原创 2019-07-28 20:09:17 · 862 阅读 · 0 评论 -
归并排序及其时间复杂度、代码(c++实现)、改进和应用场景
一、归并排序基本思想:将数组A[0 … n-1]中的元素分成两个子数组A1[0 … n/2]和A2[n/2+1 … n-1]。分别对这两个子数组单独排序,然后将一排序的两个子数组归并成一个含有n个元素的有序数组。归并排序包含不相邻元素的比较,但并不会直接交换。在合并两个已排序的数组时,如果遇到了相同的元素,只要保证前半部分数组优先于后半部分数组,相同元素的顺序就不会颠倒,所以归并排序属于稳定的...原创 2019-07-27 20:14:23 · 3120 阅读 · 0 评论 -
算法总结
难题首选动规受阻贪心暴力考虑分治思想配合排序哈希动态规划是解决相当数量问题的法宝滚动数组降低空间复杂度贪心法并不简单Dijkstra最短路径,最小生成树Prim,Kruskal算法深度优先搜索、广度优先搜索,都可以归结为暴力求解分支界限条件加快搜索效率分治法再降低问题规模上很有奇效快速排序、归并排序——递归、广义分治法排序是为了更好的查找各种排序方法的...原创 2019-03-24 19:26:09 · 116 阅读 · 0 评论 -
9.算法之动态规划
原理:1.确认原问题与子问题:原问题是求n阶台阶所有走法的数量,子问题是求1阶台阶、2阶台阶、…、n-1阶台阶的走法。2.确认状态:本题的动态规划状态单一,第i个状态即为i阶台阶的所有走法数量。3.确认边界状态的值:边界状态为1阶台阶与2阶台阶的走法,1阶台阶有1种走法,2阶台阶有2种走法,即dp[1]=1,dp[2]=2。4.确认状态转移方程:将求第i个状态的值转移为求第i-1个...原创 2019-03-21 20:56:30 · 136 阅读 · 0 评论 -
2.算法之栈、队列、堆
STL stack(栈)stack<int> s;s.top();//取出栈顶s.empty();//判断栈是否为空s.push(x);//将x添加至栈s.pop();//弹出栈顶s.size();//栈的存储元素个数原创 2019-03-24 19:04:17 · 260 阅读 · 0 评论 -
3.算法之贪心算法
举个例子:有1元、5元、20元、100元、200元的钞票无穷多张。现使用原创 2019-03-26 10:21:43 · 183 阅读 · 0 评论 -
1.算法之链表
<LeetCode>链表逆序反转链表 反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULLclass Solution {public: ListNode* reverseList(ListNode* head) {原创 2019-03-19 20:56:28 · 141 阅读 · 0 评论 -
4.算法之递归、回溯与分治
递归、回溯法回溯法又称为试探法,但是当探索到某一步时,发现原先选择达不到目标,就退回一部重新选择,这种走不通就退回重新再走的技术称为回溯法。有向无环图:78. 子集给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3]...原创 2019-03-27 21:48:23 · 223 阅读 · 0 评论 -
11.算法之快速排序
数组中的第K个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4int target=0;class Solution {public: ...原创 2019-07-26 09:57:03 · 109 阅读 · 0 评论 -
5.算法之二叉树与图
(一)二叉树的定义树是(n>=0)个结点的有限集,且这些结点满足如下关系:(1)有且仅有一个结点没有父结点,该结点成为树的根。(2)除根外,其余的每个结点都有且仅有一个父结点。(3)树中的每一个结点都构成一个以她为根的树。二叉树在满足树的条件时,满足如下条件:每个结点最多有两个孩子(子树),这两个子树有左右之分,次序不可颠倒。路径总和 II给定一个二叉树和一个目标和,找到所...原创 2019-03-28 20:09:05 · 267 阅读 · 0 评论 -
10.算法之复杂数据结构
Trie树(字典树)概述trie树,又称字典树或前缀树,是一种有序的、用于统计、排序和存储字符串的数据结构,它与二叉查找树不同,关键字不是直接保存在结点中,而是由结点在书中的位置决定。一个结点的所有子孙都有相同的前缀,也就是这个结点对应的字符串,而根结点对应空字符串。一般情况下,不是所有的结点都有对应的值,只有叶子结点和部分内部结点所对应的键才有相关的值。trie树的最大优点是利用字符串的...原创 2019-04-09 23:27:49 · 625 阅读 · 0 评论 -
7.算法之哈希表与字符串
哈希表哈希表定义List item哈希表(Hash table,也叫散列表),是根据关键字值(key)直接进行访问的数据结构,它通过把关键字映射到表中一个位置(数组下标)来直接访问,以加快查找关键字值的速度。这个映射函数叫做哈希(散列)函数,存放记录的数组叫做哈希(散列)表。...原创 2019-03-31 16:46:40 · 350 阅读 · 0 评论 -
8.算法之搜索
岛屿的个数给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3DFS:递归注意:图5搜完之后,会...原创 2019-04-04 17:28:17 · 430 阅读 · 0 评论 -
6.算法之二分查找与二叉排序树
(一)复杂度log2n(二)二分查找代码//递归实现bool binary_search(vector<int> &sort_array,int beg,int end,int target){ if(beg>end) return false; int mid=(end-beg)/2+beg;//迭代器时使用 //int mid=(beg+end)/...原创 2019-03-29 20:15:45 · 464 阅读 · 0 评论