- 博客(24)
- 资源 (1)
- 收藏
- 关注
原创 【刷题之路】生成杨辉三角/帕斯卡三角
杨辉三角或叫帕斯卡三角,定义可以百度百科一下class Solution {public: vector> generate(int numRows) { vector temp; vector> res; int i,j; for(i=1;i for(j=i-1;j>=2;j--)
2016-06-29 10:32:14 579
原创 【刷题之路】最短子数组问题
对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。给定一个int数组A和数组的大小n,请返回一个整型,代表所求序列的长度。保证A中元素均为正整数。我们需要确定最短子数组,也就是说我们需要找到需要排序的数字,同时排除应该站在原地的数字。首先从前往后遍历,不断记录下遍历的最大值,当之后的数字比他小时,记录位置,我们需要记录下最右的位置,也就是说这个数必定是在这个记
2016-06-13 11:11:45 789
原创 【刷题之路】有序矩阵查找问题
现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x。给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x。所有矩阵中数字及x均为int范围内整数。保证n和m均小于等于1000。因为矩阵是有序的,可以参照二分查找的模式,不同点在于二维数组。我们可以选则第一行最后一个元素temp作为起始,如果te
2016-06-13 10:40:16 561
原创 【刷题之路】三色排序问题
有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。由于不能使用计数排序,又只有三种元素,可以考虑分块处理。在数组头开辟一个程度为0的区域left,在尾部开一个长度为0的区域right开始遍历数组,如果元素为0,则将该元素移入left中,并将left区域长度+1,同理,如果元素为2,则将该元素移入队尾。这里所说的移入,实际上是交换。同时需要注意,与0
2016-06-13 10:27:03 649
原创 【刷题之路】有序数组组合问题
有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。请编写一个方法,将B合并入A并排序。因为A末尾有足够空间,所以应从后往前遍历这样就不用开辟新的空间来存放数组。首先比较AB最后一个数字,大的放入A最后一个位置,不断遍历。如果B遍历完了,直接返回A,如果A遍历完了,则将B按顺序放入A前面空出来的位置。class Merge {public: int* m
2016-06-13 10:10:59 204
原创 【刷题之路】重复值判断
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)通常来说判断重复值,比较有效的方法是先排序。保证额外空间复杂度为1,则选择堆排序较为合适。堆排序出现过多次,不再详述class Checker {public: bool checkDuplicate(vector a, int n) { // write code here
2016-06-13 09:50:27 372
原创 【刷题之路】跳格子/抓石子问题
你和你的朋友正在玩棋子跳格子的游戏,而棋盘是一个由n个格子组成的长条,你们两人轮流移动一颗棋子,每次可以选择让棋子跳1-3格,先将棋子移出棋盘的人获得胜利。我们知道你们两人都会采取最优策略,现在已知格子数目,并且初始时棋子在第一格由你操作。请你计算你是否能获胜。给定格子的数目n(n为不超过300的正整数)。返回一个整数,1代表能获胜,0代表不能获胜。经过枚举发现,只要格子数是4的倍
2016-06-12 11:23:56 1742
原创 【刷题之路】赛马问题
作为一个马场的主人,你要安排你的n匹赛马和另一个马场的n匹马比赛。你已经知道了对方马场的出战表,即参加每一场的马的强壮程度。当然你也知道你自己的所有马的强壮程度。我们假定比赛的结果直接由马的强壮程度决定,即更壮的马获胜(若相同则双方均不算获胜),请你设计一个策略,使你能获得尽量多的场次的胜利。给定对方每场比赛的马的强壮程度oppo及你的所有马的强壮程度horses(强壮程度为整数,且数字越
2016-06-12 10:33:00 928
原创 【刷题之路】 涂色问题
你要在一个nxm的格子图上涂色,你每次可以选择一个未涂色的格子涂上你开始选定的那种颜色。同时为了美观,我们要求你涂色的格子不能相邻,也就是说,不能有公共边,现在问你,在采取最优策略的情况下,你最多能涂多少个格子?给定格子图的长n和宽m。请返回最多能涂的格子数目。只有一种颜色,要想不相邻,每行一个隔一个涂色即可,如果行数或者列数为偶数,最多的格子即为(m/2)*n或者(n/2)*m,
2016-06-12 10:10:23 6363
原创 【刷题之路】字符串的编辑距离
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。经典动态规划问题,简历一个二维数组来解决问题首先确定初始状态
2016-06-07 11:24:28 1008
原创 【刷题之路】背包问题
一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。给定物品的重量w价值v及物品数n和承重cap。请返回最大总价值。经典动态规划问题,类似于找零钱问题,只不过在填数字的时候需要计算本次放入物品的价值,并且在下次填数的时候需要比较。
2016-06-06 22:23:19 708
原创 【刷题之路】最长公共字符串
给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”123456"或者"12C4B6"都是最长公共子序列。给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。测试样例:"1A2C3D4B56",10,"B1D23CA45B6A",12
2016-06-06 18:46:46 345
原创 【刷题之路】最长上升子序列
这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法求出序列的最长上升子序列的长度。给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。例如1,2,3,2,4,5,3,6,7,5,8,LIS就为12345678,长度为8经典动态规划问题,确定初始状态,当以第一个数结尾时,LIS很明显长度为1,若以第二个数为结尾时,判断两数大小,如例子中,则LIS就
2016-06-06 18:04:50 529
原创 【刷题之路】矩阵最小路径
有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.经典动态规划问题,首先确定初始状态,假设只有一行,则走到最后必然是这一行所有权值之和,只有一列则同理之后,计算res[1
2016-06-06 17:21:28 1463
原创 【刷题之路】跳台阶问题
有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。为了防止溢出,请将结果Mod 1000000007给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。经典动态规划问题,首先确定初始状态当只有一级台阶时,只有一种方法,res[1]=1当有两级台阶式,有两种方法,res[2]=2当有三级台阶时,想要跳上第三极
2016-06-06 17:02:33 383
原创 【刷题之路】零钱凑整问题
有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。经典的动态规划问题,首先需要确定状态,然后叠加即可。首先确定初始状态,当目标钱数为0时,无论如何只有一种方法,即不用任何面值的钱当目标钱数小于面额最小的钱时,方法数为零定义一个二维数组,i为所使用
2016-06-06 16:34:34 3150
原创 【刷题之路】分糖果
n颗相同的糖果,分给m个人,每人至少一颗,问有多少种分法。给定n和m,请返回方案数,保证n小于等于12,且m小于等于n。糖都是一样的,所以可以简化为插板问题,n个糖n-1个空,插m-1个板子,将糖分为m堆即可。C M-1 N-1class Distribution {public: int getWays(int n, int m) { // wri
2016-06-03 10:23:49 1311
原创 【刷题之路】站队问题
n个人站队,他们的编号依次从1到n,要求编号为a的人必须在编号为b的人的左边,但不要求一定相邻,请问共有多少种排法?第二问如果要求a必须在b的左边,并且一定要相邻,请问一共有多少种排法?第一问,对于n个人全排列共有n!次,其中必定有一半是a在b左边,一半是a在b右边,结果就是n!/2第二问,a必须在B左边相邻,那么两个人就是一体的,一共有(n-1)!次class StandInLine
2016-06-03 10:00:22 649
原创 【刷题之路】方格移动
在XxY的方格中,以左上角格子为起点,右下角格子为终点,每次只能向下走或者向右走,请问一共有多少种不同的走法给定两个正整数int x,int y,请返回走法数目。排列组合问题,一共可以向右走x-1步,向下走y-1步,一共是X+Y-2步,其中选择x-1步向右走即可,C X-1 X+Y-2class Robot {public: int countWays(int
2016-06-03 09:54:28 537
原创 【刷题之路】寻找奇数次出现的数2
给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。与之前不同,这次单数次出现数字为两个,仍然使用位运算,但是因为有两个数,全部异或的结果就是两个单数次异或的结果。比较朴素的想法是将
2016-06-01 21:28:31 493
原创 【刷题之路】寻找奇数次出现的数
有一个整型数组A,其中只有一个数出现了奇数次,其他的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。给定整形数组A及它的大小n,请返回题目所求数字。使用位运算异或的两个特性,即可以解决此类问题,将数组中所有数异或,剩下的数即为出现奇数次的数字class OddAppearance {public: int findOdd(v
2016-06-01 21:14:30 393
原创 【刷题之路】不使用比较返回两个数中较大的值
不使用比较只能判断两个数的差的正负,使用位运算,判断符号位即可注意若两数一正一负,可能出现相减后溢出的情况,注意判断即可class Compare {public: int getMax(int a, int b) { // write code here if(isnegitive(a) && ispositive(b)) return
2016-06-01 21:11:13 378
原创 【刷题之路】不使用额外空间交换两个数
比如,a,b,利用位运算异或的性质,1、相同的两个数异或结果为0,2、任何数与0异或都等于其本身利用a=a^b, b=a^b, a=a^b;即可以成功交换两个数class Swap {public: vector getSwap(vector num) { // write code here num[0]=num[0]^num[1];
2016-06-01 21:03:12 676
原创 【刷题之路】二叉树上最远距离
从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。最大距离不外乎两种情况1、左子树或者右子树特别庞大,最大距离出现在左子树或右子树两个节点之间;2、左右两子树节点数量大致平衡,则最大距离横跨左右子树,这种情况下必然是离头结点的左右两个子节点最远的节点之间的距离遍历时不
2016-06-01 10:26:39 497
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人