算法
线上幽灵
大道至简
展开
-
斐波那契数列
斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项,初始状态f(1) = 1, f(2) = 1, 函数的状态转移问题:f(n) = f(n-1) + f(n-2)。转载 2024-02-04 17:41:13 · 76 阅读 · 0 评论 -
C++实现LRU cache
C++实现LRU cache转载 2022-10-25 08:39:10 · 405 阅读 · 0 评论 -
快速幂算法
首先,我们先来看一道ACM程序设计题,这道题是杭电OJ中序号为2035的题目,没做过这道题目的同学可以跟着一起做一下(***点击此处***传送),题目如下:问题描述:求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”这道题目乍一看会觉得并不难啊,题目短短一行而已,而且思路也很容易,求幂这种算法一般在初学程序设计语言的时候应该都有联系过,只要写一个简单的循环就能够搞定。/*** 普通的求幂函数* @param base 底数* @param power 指数。转载 2022-09-19 08:44:50 · 405 阅读 · 0 评论 -
K-Means算法
一、聚类今天说聚类,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别。分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail邮箱里有垃圾邮件分类器,一开始的时候可能什么都不过滤,在日常使用过程中,我人工对于每一封邮件点选“垃圾”或“不是垃圾”,过一段时间,Gmail就体现出一定的智能,能够自动过滤掉一些垃圾邮件了。这是因为在点选的过程中,其实是给每一条邮件打了一个“标签”,这个标签只有两个值,要么是“垃圾”,要么“不是垃圾”,Gmail就会转载 2020-05-24 15:42:20 · 1386 阅读 · 0 评论 -
2018腾讯校招编程题——最重要的城市
代码:#include <iostream>#include <vector>#include <stack>using namespace std;int dfs(vector<vector<int>>& cities, int k, vector<int>& temp){原创 2018-09-16 16:10:06 · 1158 阅读 · 0 评论 -
抖音网红
题目: 在抖音上,共有N个用户,如果A关注B,如果B关注C,则A间接关注了C,如果N个用户都关注了用户h(可以是直接关注和间接关注),则用户h为网红,求一共有多少网红?输入: 第一行输入用户的数量N,和关系数量M 第二行输入M个关注关系例如:4 31 2 3 4 1 4代码:#include <iostream>#inclu...原创 2018-09-09 18:39:41 · 1195 阅读 · 0 评论 -
找到字符串中不重复出现字符的最长子串长度
题目: 给定一个字符串,找到不重复字符的最长子字符串的长度。 例如,对于“abcabcbb”,不重复字母的最长子字符串是“abc”,长度为3.对于“bbbbb”,最长子字符串是“b”,长度为1。解析:由于这个题目只要给出最长不重复子串的长度,所以代码比较简单。第一思路就是利用哈希表来进行操作。用字符当做键值,字符在串中的位置当做实值。用pre变量记录字符第一次出现的位置,最大长...转载 2018-09-09 16:06:23 · 485 阅读 · 0 评论 -
背包问题
问题假定背包的最大容量为W,N件物品,每件物品都有自己的价值和重量,将物品放入背包中使得背包内物品的总价值最大。背包问题wiki可以想象这样一个场景——小偷在屋子里偷东西,他带着一只背包。屋子里物品数量有限——每件物品都具有一定的重量和价值——珠宝重量轻但价值高,桌子重但价值低。最重要的是小偷背包容量有限。很明显,他不能把桌子分成两份或者带走珠宝的3/4。对于一件物品他只能选择带走...转载 2018-09-07 21:42:04 · 135 阅读 · 0 评论 -
并查集详解 ——图文解说,简单易懂
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,HDU1232畅通工程首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断...转载 2018-08-25 16:16:02 · 5874 阅读 · 8 评论 -
排序之外部排序
有时,待排序的文件很大,计算机内存不能容纳整个文件,这时候对文件就不能使用内部排序了(这里做一下说明,其实所有的排序都是在内存中做的,这里说的内部排序是指待排序的内容在内存中就可以完成,而外部排序是指待排序的内容不能在内存中一下子完成,它需要做内外存的内容交换),外部排序常采用的排序方法也是归并排序,这种归并方法由两个不同的阶段组成: 采用适当的内部排序方法对输入文件的每个片段进行排序,将排...转载 2018-08-21 19:11:59 · 239 阅读 · 0 评论 -
2018年拼多多校招笔试——拼出一个与输入的单词都不相同的单词
代码:#include<string>#include<iostream>#include<vector>#include<algorithm>#include<unordered_set>using namespace std;class Solution{public: string core(...原创 2018-08-30 23:11:37 · 1187 阅读 · 0 评论 -
判断一个多边形是凸多边形还是凹多边形
题目: 判断一个多边形是凸多边形还是凹多边形 输入: 输入包含多组测试数据,每组数据占2行,首先一行是一个整数n,表示多边形顶点的个数,然后一行是2×n个整数,表示逆时针顺序的n个顶点的坐标(xi,yi),n为0的时候结束输入。 输出: 对于每个测试实例,如果地块的形状为凸多边形,请输出“convex”,否则输出”concave”,每个实例的输出占一行。 ...转载 2018-09-06 12:32:28 · 11736 阅读 · 1 评论 -
将单链表的每k个节点之间逆序
题目: 给定一个单链表的头结点head,实现一个调整单链表的函数,使得每k个节点之间逆序,如果最后不管k个节点一组,则不调整最后几个节点。Example: 链表:1->2->3->4->5->6->7->8->nullptr, k = 3 调整后:3->2->1->6->5->4->转载 2018-09-16 00:26:12 · 1408 阅读 · 0 评论 -
判断一个数组,是否可以分成两个数组之和相等的数组
题目: 判断给定的一个数组,是不是可以分成两个数组之和相等的数组Example: [1,2,6,3]可以分成[1,2,3]和[6]解析:此题可以用0,1背包问题来解决,分成的两个数组之和,一定为整个数组之和的一半,所以将背包容量设为初始数组之和的一半即可,最后在判断背包所装的容量是不是整个数组之和的一半。代码:#include <iostream&...原创 2018-09-06 16:11:31 · 14612 阅读 · 5 评论 -
删除链表中重复的节点——重复节点不保留
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 代码:/*struct ListNode { int val; struct ListNode *next; ListNo...转载 2018-09-16 09:13:20 · 308 阅读 · 0 评论 -
删除链表中重复的节点——重复节点保留一个
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点保留一个,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->3->4->5 代码1:时间复杂度O(n),空间复杂度O(n)ListNode* remove(ListNode* head){ ...转载 2018-09-16 22:10:19 · 1070 阅读 · 0 评论 -
剑指Offer(第二版)面试题68:树中两个节点的最低公共祖先节点
题目:输入两个树节点,求它们的最低公共祖先节点。 一、二叉搜索树应聘者:这棵树是不是二叉树? 面试官:是二叉树,并且是二叉搜索树。 思路:二叉搜索树是经过排序的,位于左子树的节点都比父节点小,位于右子树的节点都比父节点大。既然要找最低的公共祖先节点,我们可以从根节点开始进行比较。若当前节点的值比两个节点的值都大,那么最低的祖先节点一定在当前节点的左子树中,则遍历当前...原创 2018-09-14 09:33:22 · 195 阅读 · 0 评论 -
2018迅雷校招编程题——红黑积木
题目: 有红黑两种积木,红积木用正数A表示,黑积木用负数B表示,将积木排成一排,每7个积木代表数字之和要小于等于0,选17个积木排成一排,求17个积木最大之和代码1:#include <iostream>#include <vector>using namespace std;int main(){ int a, b; ci...原创 2018-09-14 09:36:24 · 614 阅读 · 0 评论 -
链表排序.md
题目:Sort a linked list in O(n log n) time using constant space complexity.Example 1:Input: 4->2->1->3Output: 1->2->3->4Example 2:Input: -1->5->3->4-&g...原创 2018-10-07 20:40:08 · 89 阅读 · 0 评论 -
插入、希尔、冒泡、快速、选择、堆、归并排序算法和性质
插入、希尔、冒泡、快速、选择、堆、归并排序算法和性质。原创 2018-10-09 10:08:30 · 941 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目:输入一个字符串,找出字符串中最长的不含重复字符的子字符串,计算该子字符串的长度。假设字符串中的字符为“a~z”,例如 arabcacfr ,最长的字符串为 rabc 和 acfr ,长度为 4 。 代码:int Find_Max_Len(string str){ int len = str.length(); if (len < 2) ...原创 2018-08-02 16:05:39 · 139 阅读 · 0 评论 -
把数字翻译成字符串
题目:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。 代码:int Get_Translation(int num){ string str = to_string(nu...原创 2018-08-02 12:40:55 · 425 阅读 · 1 评论 -
排序——选择排序(C++实现)
选择排序中两个重要的排序方法:简单选择排序和堆排序。选择排序的基本思想是:每一趟(例如第i趟)在后面n-i+1(i=1,2,...,n-1)个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,知道第n-1趟做完,待排序元素只剩下1个,就不用再选了。简单选择排序简单选择的代码:#include using namespace std;void Select原创 2017-10-21 21:15:05 · 1833 阅读 · 0 评论 -
排序——快速排序(C++实现)
快速排序是对冒泡排序的一种改进。其基本思想是基于分治法:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表中划分为独立的两部分L[1...k-1]和L[k+1....n],使得L[1...k-1]中所有元素小于等于pivot,L[k+1....n]中所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一趟快速排序。而后分别递归地对两个原创 2017-10-21 15:34:06 · 708 阅读 · 0 评论 -
排序——冒泡排序(C++实现)
冒泡排序算法的基本思想:假设待排序长为n,从后往前两两比较相邻元素的值,如为逆序,则交换它们,直到序列比较完。我们称为一趟冒泡,结果将最小的元素交换到待排序列的第一个位置(关键字最小的元素如气泡一般逐渐往上“漂浮”直至“水面”,这就是冒泡排序名字的由来)。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中最小元素放到了序列的最终位置,......,这样最多原创 2017-10-21 14:39:07 · 484 阅读 · 0 评论 -
排序——插入排序(C++实现)
插入排序的两个重要的的排序算法:直接插入排序和希尔排序。直接插入排序代码:#include using namespace std;void InsertSort(int a[], int n){ //此算法的排序数组下标是从1开始的,下标为0的位置被当作哨兵 int j = 0; for (int i = 2; i <= n; ++i) //依次将a[2]~a[n]原创 2017-10-20 10:22:06 · 302 阅读 · 0 评论 -
复制含有随机指针节点的链表——C++实现
【题目】: 一种特殊的链表节点类描述如下:struct RandomListNode{ int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) {}}; RandomListNode类中的l原创 2017-10-09 09:57:43 · 1057 阅读 · 0 评论 -
求最大子矩阵的大小——C++实现
题目: 给定一个整型矩阵matrix,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩阵区域为1的数量。 例如: 1 1 1 0 其中,最大的矩形区域有3个1,所有返回3。 再如: 1 0 1 1 1 1 1 1 1 1 1 0 其中,最大原创 2017-10-07 09:42:40 · 2934 阅读 · 0 评论 -
滑动窗口的最大值——C++版
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2原创 2017-09-26 22:54:52 · 3193 阅读 · 0 评论 -
遗传算法解决TSP问题(c++实现)
此文章转载自:http://blog.csdn.net/qq547276542/article/details/77805423遗传算法简介 遗传算法(Genetic Algorithms,简称 GA)是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目标的优化。遗传算法的实质是通过群体搜索技术,根据适者生存的原则转载 2017-12-26 12:12:52 · 1310 阅读 · 0 评论 -
大数乘法问题及其高效算法
题目编写两个任意位数的大数相乘的程序,给出计算结果。比如:题目描述: 输出两个不超过100位的大整数的乘积。 输入: 输入两个大整数,如1234567 和 123 输出: 输出乘积,如:151851741或者求 1234567891011121314151617181920 * 2019181716151413121110987654321 的乘积结果分析所谓大数相乘(Multiplication...转载 2018-03-22 19:32:04 · 3835 阅读 · 0 评论 -
不用乘法实现两个数的乘法
不用乘法实现两个数的乘法int multiplication(int a, int b) { int sign = 1; if (b < 0) { sign = -sign; b = -b; } if (a < 0) { sign = -sign; a = -a...原创 2018-08-10 19:47:47 · 4825 阅读 · 1 评论 -
剑指Offer(第二版)面试题68:树中两个节点的最低公共祖先节点
题目:输入两个树节点,求它们的最低公共祖先节点。 一、二叉搜索树应聘者:这棵树是不是二叉树? 面试官:是二叉树,并且是二叉搜索树。 思路:二叉搜索树是经过排序的,位于左子树的节点都比父节点小,位于右子树的节点都比父节点大。既然要找最低的公共祖先节点,我们可以从根节点开始进行比较。若当前节点的值比两个节点的值都大,那么最低的祖先节点一定在当前节点的左子树中,则遍历当前...原创 2018-08-04 15:31:20 · 586 阅读 · 0 评论 -
和为s的连续正数序列
题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15;所以打印出三个连续序列1~5,4~6,7~8。思路:从递增数组中两个数和为s的数得到启示,我们也可以设置两个指针,一个指向当前序列的最小的数,一个指向当前序列最大的数。设置两个指针,一个为small指向当前正数序列中最小的数,一个为big指向当前...原创 2018-08-03 17:09:46 · 157 阅读 · 0 评论 -
费雪耶兹(Fisher–Yates) 也被称作高纳德( Knuth)随机置乱算法
Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yates随机置乱算法是相当有效的,需要的时间正比于要随机置乱的数,不需要额为的存储空间开销。一、算法流程: 需要随机置乱的n个元素的数组a: for i 从n-1到1j <—随机整数(0...转载 2018-07-30 10:58:26 · 1749 阅读 · 0 评论 -
汉诺塔算法 ----C++语言递归实现
起源汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。抽象为数学问题如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上...原创 2018-04-24 17:19:59 · 20256 阅读 · 4 评论 -
求多个数的最小公倍数——C++实现
穷举法:#include <iostream>#include <vector>using namespace std;int commonMultipleOfTwoNumber(int a, int b){ int result = a; if (a == 0 || b == 0) throw new exception("error"); whil...原创 2018-05-01 16:40:37 · 8059 阅读 · 2 评论 -
最短路径问题---Dijkstra算法详解
此文章转载自:https://blog.csdn.net/heroacool/article/details/51014824迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止基本思想通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进...转载 2018-04-10 20:14:58 · 59566 阅读 · 7 评论 -
KMP算法
此文章转载自:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/For the past few days, I’ve been reading various explanations of the Knuth-Morris-Pratt string searching al...转载 2018-03-13 21:09:14 · 153 阅读 · 0 评论 -
优化问题的解决方法
贪心算法属于启发式算法的一种形式和应用,使用贪心算法的方式:把优化问题划分成一个元素集,每一步使用每种贪心启发来寻找下一个生成部分解的元素或者方法,循环渐进,直到生成一个可行解。原创 2017-09-07 10:34:31 · 1320 阅读 · 0 评论