![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编程艺术、一
文章平均质量分 63
知之可否
这个作者很懒,什么都没留下…
展开
-
最长递增子序列(LIS)
给定一个长度为n的数组,找出一个最长的单调递增子序列(不一定连续,当时先后顺序不能乱)。 更正式的定义是:设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,其中k1。比如数组A 为{10, 11, 12, 13, 1, 2, 3, 15}, 那么最长递增子序列为{10,11,12,13,15}。以i结尾的序列的最长递增子序列和其[0, i - 1]“前缀原创 2014-12-11 11:11:02 · 651 阅读 · 0 评论 -
编程之美:层次遍历二叉树若干问题
1.层次遍历不多说,很简单2.按深度从下到到上分层遍历二叉树用栈保存每层即可#include #include#include#includeusing namespace std;struct node{ int value; node* left; node* right;};void printNodeByLevelD原创 2016-06-17 11:22:06 · 372 阅读 · 0 评论 -
编程之美: 求二叉树中节点的最大距离
问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。书上的解法书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况B: 路转载 2016-06-16 15:51:10 · 2204 阅读 · 0 评论 -
编程之美:链表有环,如何判断相交
如果两个链表无换,判断是否相交很简单,判断两个环的最后一个节点指针是否相等即可。题目描述:上面的问题都是针对链表无环的,那么如果现在,链表是有环的呢?上面的方法还同样有效么?分析:如果有环且两个链表相交,则两个链表都有共同一个环,即环上的任意一个节点都存在于两个链表上。因此,就可以判断一链表上俩指针相遇的那个节点,在不在另一条链表上。无环链表和有环链表是不可能相原创 2016-06-16 09:38:55 · 2478 阅读 · 1 评论 -
编程之美 最短摘要生成
本来以为这个会很难的,因为自己不是很了解这方面的东西。看了下解释 大致明白了,就是用最少的句子 ,包含所有的关键词。ok~看了编程之美的code后 感觉很好,类似kmp算法,跳过已经比对过的字符串,然后向后移动。思路就是 比如 我的关键词为 bottom bot 我的句子 hello are you bottom of do the原创 2016-06-15 22:56:31 · 567 阅读 · 0 评论 -
电话号码对应英语单词
其实就是搜索解答树的暴利搜索。编程之美P222#include using namespace std;char c[10][10]={ "","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};int total[10]={0,0,3,3,3,3,3,4,3,4};void recursiveSearch(in转载 2016-06-15 15:05:24 · 808 阅读 · 0 评论 -
区间重合判断、百度之星题解之重叠区间大小
给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。方法一 先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。转载 2016-06-14 17:50:34 · 2712 阅读 · 0 评论 -
数组分割
一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:S(k, 1) = {A[i] | 1S(k, k) = {A[1]+A[2]+…+A[k]}S(k, i) = S(转载 2016-06-14 15:19:22 · 376 阅读 · 0 评论 -
首尾相连数组的最大子数组和
题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的。数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr[n-1],arr[0],…,arr[j],现在请你这个ACM_Lover用一个最高效的方法帮忙找出所有连续子数组和的最大值(如果数组中的元素全部为负数,则最大和为0,即一个也没有选)。 输入:原创 2016-06-14 10:13:58 · 494 阅读 · 0 评论 -
求子数组的最大和
题目描述:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18最初觉得跟最长递增子序列机器相似,写了程序如下原创 2015-02-05 09:26:00 · 714 阅读 · 3 评论 -
逆转一个整数的二进制表示问题
写一个函数逆转整数的二进制表示 unsigned ReverseBit(unsigned x);unsigned x = RevBit(0xf0ec9999);x应该为 0x9999370f。0xf0ec9999 == 11110000111011001001100110011001(二进制)0x9999370f == 100110011001100100110111000转载 2016-06-13 15:06:01 · 570 阅读 · 0 评论 -
编程之美:水王问题及扩展
题目描述:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?扩展问题:随着Tango的发展,管理员发现,“超原创 2016-06-08 12:07:26 · 1649 阅读 · 0 评论 -
编程之美:二分查找
前三个问题不讲,已经解决过了 可以参见 http://blog.csdn.net/gao1440156051/article/details/51699085 http://blog.csdn.net/gao1440156051/article/details/51699983现在写最后两个1.最大的i使得arr[i]小于v,其实就是求等于v的下界的前一个元素。 2.最小的i使得arr[i]原创 2016-06-17 15:37:40 · 436 阅读 · 0 评论 -
编程之美:蚂蚁爬杆
扩展问题:从左边数起的第i只蚂蚁什么时候走出木杆?所有蚂蚁从一开始到全部离开木杆共碰撞了多少次?什么时候轮船可找到救生圈?解答:1. 从左边数起的第i只蚂蚁什么时候走出木杆?现在来解决扩展1。这个解答甚是精妙,通俗点来说,我们假设每只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头。这种情况下,每次有一只蚂蚁离开木杆都意味着一袋粮食离开木杆(虽然可能已经不是它刚开始时背的那一袋了转载 2016-06-20 09:28:14 · 2619 阅读 · 0 评论 -
编程之美: 点是否在三角形内
如果有一个点D在三角形ABC内,那么沿着三角形的边界逆时针走,点D一定保持在边界的左边,也就是说点D在边AB、BC、CA的左边。于是问题转化成如何去判断一个点P3是在射线P1P2的左边,这其实是个数学问题,通过判断P1P2和P1P3两个向量的叉积的正负来判断。#includeusing namespace std;struct point{ double x; d原创 2016-06-20 10:33:00 · 1427 阅读 · 0 评论 -
数字拆分成4段,怎样使得4段的乘积最小
题目是:给出一个数字(10,000~100,000,000),把这个数字拆分成4段,怎样使得4段的乘积最小。比如12345拆分成1*2*3*45=270, 10000=1*00*0*0=0。题目分析:这道题很明显能用动态规划(dp)来求解,用dp(i,j)表示:以指向第j个位置字的符结束的字符串还需要分为i份所得到的最小乘积,那么题目中的12345的正解就是dp(4,5)表示以第5转载 2016-08-14 22:43:22 · 1200 阅读 · 0 评论 -
地牢逃脱
给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 输入描述:每个输入转载 2016-08-14 21:02:08 · 740 阅读 · 0 评论 -
合唱团
合唱团有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?网址:http://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8……想了半天转载 2016-08-14 20:42:49 · 550 阅读 · 0 评论 -
求一个字符串中连续出现次数最多的子串
例如字符串“abababc”,最多连续出现的为ab,连续出现三次。求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:abababcbababcababcbabcabcbcc可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab。可以看出规律来,一个字符串s,如果第一次出现在后缀数组i的前面,那么如果它重复出现,下一次出现应该在原创 2016-09-17 20:17:47 · 1755 阅读 · 0 评论 -
等式变换
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。1 2 3 4 5 6 7 8 9 = X比如:12-34+5-67+89 = 51+23+4-5+6-7-8-9 = 5请编写程序,统计满足输入整数的所有整数个数。输入: 正整数,等式右边的数字输出: 使该等式成立的个数样例输入:5原创 2016-08-25 17:08:34 · 1031 阅读 · 0 评论 -
括号匹配
描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入第一行输入一个正整数N,表示测试数据组数(N每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100输出对于每组测试数据都输出一转载 2016-08-16 15:14:34 · 441 阅读 · 0 评论 -
数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次
本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢。欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求:数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。 这个题目非常有意思,在转载 2016-08-16 11:51:58 · 855 阅读 · 0 评论 -
求无向连通图的割点
1. 割点与连通度在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一个没有关节点的连通图称为重连通图(biconnected graph)。若在连通图上至少删去k 个顶点才能破坏图的连通性,则称此图的连通度为k。关节点和重连通图在实际中较多应用。显然,一个表示通信转载 2016-08-16 10:38:43 · 1396 阅读 · 0 评论 -
字符串中有*,*可以用0和1替换,输出所有的字符串
#include#include#includeusing namespace std;//字符串中有*,*可以用0和1替换,输出所有的字符串void dfs(string s,int cur){ if (cur == s.size()){ cout << s << endl; return; } if (s[cur] == '*'){ s[cur] = '0原创 2016-08-15 19:49:04 · 1285 阅读 · 1 评论 -
最长回文子串、最长回文子序列、回文子序列个数
最长回文子串已经整理过:http://blog.csdn.net/gao1440156051/article/details/517281031.最长回文子序列要求:给定字符串,求它的最长回文子序列长度。回文子序列反转字符顺序后仍然与原序列相同。例如字符串abcdfcba中,最长回文子序列长度为7,abcdcba或abcfcba。思路:动态规划思想原创 2016-06-21 17:11:59 · 538 阅读 · 0 评论 -
编程之美:扫雷的概率
题目说, 一局16×16的扫雷游戏刚开始, 只翻开了两格, 分别显示数字1和2, 如下图所示(只画出了3×5的局部示意图).在一个16*16的地雷阵中,有40个地雷。用户点击了两下,出现如图4-21的局面。分析图4-22所示的这个局部。问题1:当游戏中有40个地雷没有发现时,A、B、C三个方块有地雷的概率(P(A),P(B),P(C))各是多少?根据数字1和2的转载 2016-06-20 15:53:08 · 3294 阅读 · 0 评论 -
24点游戏
/** * 解法:假设4 个数的集合A={1,2,3,4}, * 先取前两个数进行不同的四则运算,1+2=3,1-2=-1,2-1=1,1/2=0.5,2/1=2,1x2=2, * 将所得的结果递归的与集合A中剩下的进行四则运算, * 问题规模从4个变成3个。。。最后变成2个。 * */ #include<iostream>#include<string>usin转载 2016-06-08 09:54:01 · 518 阅读 · 0 评论 -
环状链表unique
编码实现环状单项链表(尾指针直接指向头指针,之间没有空节点),去掉连续的重复元素的操作。#include<iostream>#include<vector>using namespace std;struct Tnode{ int value; Tnode* next; Tnode(int x) :value(x), next(NULL){}};Tnode* uniqu原创 2016-06-02 15:17:16 · 436 阅读 · 0 评论 -
负数排在正数前面,
转自:http://qing.blog.sina.com.cn/1570303725/5d98eeed33000hcb.html 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。思考的过程就略去了,直接说结果吧。我想到的算法,空间复杂度为O(1),时间复杂度为O(N*logN)。首先,定义这样一个过程为“翻转”:(a1,a2,…,am,b1,b2,转载 2015-03-21 21:52:30 · 6123 阅读 · 3 评论 -
二维数组和最大的子矩阵
题目:给出一个 m*n 的二维矩阵(元素可为正可为负),求该二维矩阵的一个子矩阵,且此子矩阵中所有元素的和最大,并输出该矩阵的和。方法1: i到j行的数组相加,得到一个一维数组。在整个一维数组上求和最大的连续子数组。#include <iostream>using namespace std;int *sum_i_j(int **data,int cols,int i,int j){ i原创 2015-02-05 22:33:44 · 2992 阅读 · 0 评论 -
杨氏矩阵查找
在一个m 行n 列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从 上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组 中是否含有该整数。 【方案一】 <二分查找> 对于杨氏矩阵,由于每行每列均是有序的,则可以于矩阵采用二分查找。具体方法是: 对于当前子矩阵a[i][j]~a[s][t],中间元素为a[(i+s)/2][(j+t)原创 2015-03-20 16:47:06 · 557 阅读 · 0 评论 -
奇偶调序
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, 所有偶数位于数组的后半部分。要求时间复杂度为O(n)。 分析: 1. 你当然可以从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个 数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该 偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,只是这种方法总的 时间复杂度是O原创 2015-03-07 15:00:39 · 647 阅读 · 0 评论 -
回溯问题+幂集、排列、子集和问题、八皇后问题
1.递归问题递归里面用return了,那么函数遇到return 就不走了,是不是就不用归了?这这个问题比如下面的代码:#includeusing namespace std;void Function(int n){ if(n == 1) { cout<<"n="<<n<<endl; return; } Function(n-1)原创 2014-12-04 16:20:47 · 1851 阅读 · 0 评论 -
和为定值的两个(多个)数
一、寻找和为定值的两个数题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如果有多对数字的和等于输入的数字,输出任意一对即可。1.hash只需O(1)的时间,但需要O(n)的额外空间来表示数字的位置。只需查找sum-a是否存在即可。2.先排序,再二分查找排序需要nlogn时间,二分查找对于每个a,sum-a是否存在需要logn,因此总时间为O(原创 2014-12-04 11:26:43 · 1821 阅读 · 0 评论 -
动态规划
这篇文章在之前的博客上被阅读了几万次了、百度搜索动态规划显示在第2条(第一条是百度百科)、推荐一下。终于来到了算法设计思想中最难,也最有趣的这部分,在去年的google笔试中,7道算法设计题有2道动态规划(Dynamic Programming)。看了这么久的算法,这部分也是唯一感觉到了比较难的地方,从这篇文章开始,将花连续的篇幅来讨论一些动态规划的问题。这包括转载 2014-12-09 22:26:43 · 786 阅读 · 0 评论 -
字符串包含问题
假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?比如,如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPO答案是true,所有在string2里的字母string1也都有。原创 2014-11-02 22:51:55 · 803 阅读 · 0 评论 -
字符串左旋转问题
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。1.方法一原创 2014-10-30 09:41:31 · 741 阅读 · 0 评论 -
主元素问题
问题描述:设T[0:n-1]是n个元素的数组。对任意一个元素x,设S(x)={i|T[i]=x}。当|S(x)|〉n/2时,称x为T的主元素。设计一个线性时间算法,确定T[0:n-1]是否有一个主元素。大小为N的数组A,其主元素是一个出现超过N/2次的元素(从而这样的元素最多有一个)。算法分析:通过对问题目的性的研究,可以得到这样的一个结论:在元素数组中,删去不同的原创 2014-10-25 16:31:27 · 1182 阅读 · 0 评论 -
最大连续乘积子串
给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出 的最大乘积连续子串为3,0.5,8。也就是说,上述数组中,3 0.5 8 这3 个数的乘积3*0.5*8=12 是最大的,而且是连续的。跟以前写的这道题http://blog.csdn.net/gao1440156051/article/details/43498407 求子数组的最大和很像。不同点原创 2015-03-23 22:47:27 · 967 阅读 · 0 评论 -
最长公共子序列(LCS)
什么是最长公共子序列呢?好比一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommonSubs原创 2015-02-10 21:01:09 · 877 阅读 · 0 评论