- 博客(230)
- 收藏
- 关注
原创 纠结了好几天的GMock学习小结
这周project中遇到了用GMock实现的unit test,看了doc依旧很迷,今天终于想明白了,在此记录一下。首先,为什么需要GMock,只用GTest不行吗?GTest作为unit test很好理解,即为test一个函数end to end的输入输出对不对,例如int Factorial(int n); // Given an input n, returns the re...
2020-01-03 14:25:46
2504
原创 LeetCode 329. Longest Increasing Path in a Matrix
题意:给另一个二维矩阵,求最长上升路径。开始想的是,如果是最短路,直接bfs就行了。后来发现,这个问题没有source和destination。最短路很trivial,就是1。后来发现这不就是很多年前ACM入门的滑雪题目吗。。。滑雪题目是从高的点往谷底的最长路。所以是dp,因为每个point依赖于其邻居,如果邻居比它高,increasing path就能接上,否则得重新从1 累加。...
2019-11-21 13:24:42
241
原创 LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
题意:给定一组array,找出三个size=k的子数组,使得和最大。若有多个解输出字典序最小的。第一反应是dp,dp[i][j]表示以i结尾,[0,...,i]中有j个子数组的最大和。要求出index,需要记录所有的previous状态转移的index,再用dfs求解。然后RE了就洗洗睡了。这一题有多assumption没有用上,1. 子数组size=k而不是任意大小。固定size,all...
2019-11-20 13:37:33
251
原创 LeetCode 325. Maximum Size Subarray Sum Equals k
这一题开始以为是sliding window,后来发现,因为有负数,sum不具有单调性,没有办法用slidng window找出optimal solution。如果考虑brute force的做法,即枚举两个端点i,j, 计算[i,...,j]的和是否等于k。计算区间和可以通过前缀和预处理O(1)得出。但是这一题的要求是是否等于k,而不是最大值或者最小值。所以如果我们知道前缀和presu...
2019-11-16 13:43:55
218
原创 LeetCode 152. Maximum Product Subarray
题意:给定一个数组,求最大连续子数组的乘积。感觉是dp但是没想出来。简单版本的题目是连续子数组的和,这里面状态定义是以i为结尾的最大子数组的和。需要定义以i为结尾而不是[0,..,i]区间内某个子数组的和,是因为子数组是连续的,以i为结尾可以直接从dp[i-1]转移到dp[i]。但是求和问题的正数负数都有累加效应,比如,如果是正数往子数组中添加加会一直增大,负数就会一直减小。但是乘积没有这...
2019-11-15 13:34:24
179
原创 Problem B. Code-Eat Switcher Google Kick Start Round E 2019
题意:每天分为S个time slots, Umon每个time slot可以可以花一部分时间eating,花剩下的时间coding。整个time slot i都用来eating的收益是E[i],都用来coding的收益是C[i],要求分配每个time slot的coding,eating百分比,保证每一天所有time slot的coding, eating收益之和不低于某个lower bound。...
2019-08-31 16:05:24
553
原创 Problem A. Cherries Mesh Google Kick Start Round E 2019
题意:给定一个N个顶点全连通图,给定M个边weight=1,剩下的边weight=2,问移去一些edge后可以使得剩下的图是连通的且weight和最小,求最小的weight和。一眼瞄上去是最小生成的树,从图中找出一棵树, such that cover所有的点且边的weight和最小。但是最小生成树需要枚举所有的边,复杂度是N^2,而且没有利用到这一题中weight只有1和2两个值的条件。...
2019-08-25 19:42:49
485
原创 Problem C. Cave Escape Google Kickstart Round G 2018 [Small Input]
题意:给一个矩阵,标记为obstacle的点不可以经过,trap的点经过会损失对应的energy。给定起点,终点和初始能量,问经过最优路径从起点到终点剩余的energy最大是多少。小数据没有增加能量的点,所以可以用bfs解决。不同于普通的bfs找到最短路径,这里需要找到energy最高的路径,所有priority queue优先扩展energy最高的节点即可。#include<io...
2019-01-22 15:13:54
484
原创 Problem B. Combining Classes Google Kickstart Round G 2018
题意:每个班级的分数是[L_i,R_i],区间内的分数有且只有一个。一共N个班级,有Q个query,问第K高的分数是多少。有点类似于区间合并问题。先将区间转成左闭右开的[l,r),从小到大排序后扫描区间,遇到左端点+1,遇到右端点-1,扫描之后就得知每个点被几个区间覆盖了。然后再求后缀和,对于每个点x,suffixsum[x]表示分数>=x的个数。通过二分搜索lower_bound可...
2019-01-22 15:09:49
484
原创 Problem A. Product Triplets Google Kickstart Round G 2018
题意:给定一组整数数组,找出满足a*b=c的三元组的个数。有点像leetcode 的three sum。数组排序后,如果x<y<z且三者都非零,一定有A[z]>A[x],A[z]>A[y],所以只要枚举x,y,在[y+1,N]的范围内寻找A[x]*A[y]是否存在即可。因为可能有多个相同值得A[z]存在,所以需要用lower_bound和upper_bound找出范围。...
2019-01-22 13:00:56
461
原创 Problem A. Common Anagrams Google Kickstart Round F 2018
题意:两个字符串A,B,问有多少对子串是anagrams(含有相同的字母,orderless)枚举子串的长度l,维护一个sliding windown frequqncy array。frequency从左往右移动,最左边移除的字母对应的频率减一,最右边新加入的字母频率加一,再比较AB两个子串的frequency array是否相同。#include<iostream>#i...
2019-01-22 12:43:42
232
原创 Question 13-20 Homework 4 Machine Learning Foundation 机器学习基石 作业四 python code
实现ridge regression, V-flod cross validation。import numpy as npimport sysimport mathdef load_data(filename): x = [] y = [] try: fin = open(filename, 'r') except IOError:...
2019-01-12 15:45:02
393
原创 Question 13-20 Homework 3 Machine Learning Foundation 机器学习基石 作业三 python code
实现linear regression和logistic regressionimport numpy as npimport sysimport mathdef pro1(): sigma = 0.1 err = 0.008 d = 8.0 print (d + 1) / (1 - err / sigma / sigma)def pro7():...
2019-01-12 15:43:12
281
原创 Question 17-20 Homework 2 Machine Learning Foundation 机器学习基石 作业二 python code
一维直线上有N个点分成两类,hypothesis set是positvie or negative的射线,VC dimension是2N,其中N个点中间的interval任选一个作为射线的起点,总共2(N-1)个,全是o或者x的分类方法有两个。(注意最右边的点x>max(x[i[)作为起点,positive ray和negative ray分类的效果相同,所以算作一类,最左边的点x<m...
2018-12-14 21:28:04
284
原创 Question 15-20 Homework 1 Machine Learning Foundation 机器学习基石 作业一 python code
实现PLA和PLA Pocket。visit example次序是顺序或者random cycle。Question 18 中“visit examples purely randomly”需要循环前先设定一个random cycle,再loop整个random ordered example。我开始的实现是每次random挑一个example,这样error很高,感觉是因为没有保证每个examp...
2018-11-19 13:15:30
334
原创 Problem A. Big Buttons The Ways Google Kickstart Round H 2018
题意:构造长度为N的字符串,每一位可以是R或者B。给了P个前缀,构造的字符串不可包含这P个前缀。(如果不是作为前缀出现则可以。)问有多少种构造方式。如果前缀长度是x,以此为前缀,有2^(N-x)个字符串是invalid的。如果这P个前缀是互斥的,invalid的总和就是 sum_x 2^(N-x),但是P个前缀可能有重合,比如RB,RBBB这种。emmm然后我想到了容斥原理。但是容斥原理g...
2018-11-18 21:43:23
538
原创 Problem B. Mural Google Kickstart Round H 2018
题意:画家在墙上画壁画,墙在水平方向被分成N段,每一段有一个value值。画家每天画一段而且只能在已经画过的sections边上接着画。每天会来一次洪水,洪水会毁掉未被画过的,且之和一个section相连的部分。被洪水会掉的部分不能在画画。问在worst case下,画家能得到的最大value是多少。这一题题目很绕,洪水每次只能毁掉剩余的section中最左边or最右边没被画过的部分。画家画的...
2018-11-18 21:18:43
725
原创 Problem C. Let Me Count The Ways Google Kickstart Round H 2018
题意: 有N对couple坐在一排,其中指定的M对newlywed couple中,每个couple不能挨着坐。问一共多少种就坐方式。结果需要mod 1e7,肯定是个算排列组合数的问题。很容易联想到容斥原理。但是开始纠结容斥原理需要计算所有的子集,总共要算2^N个,肯定会超时。最后半小时才想起来,对于大小相同的子集,他们对应的组合数是一样的,所以每个size只要算一次就行了。然而中途出现了Bu...
2018-11-18 20:57:12
495
原创 LeetCode 683. K Empty Slots
题意:1,...,N个位置各有一朵花,开花时间是1,...,N的某一天且开花时间各不相同。问的第几天(earliest days)有两朵花开且这两朵花中间有k朵花且全部没开。constraint是中间相隔k朵花,所以先把input转化position数组更直观些,position[i]表示位置i的开花时间。对于两朵花x,x+k+1,如果中间的k朵花都没开,那么中间k朵花的开花时间都比x,x+k...
2018-10-18 20:01:12
389
原创 LeetCode 470. Implement Rand10() Using Rand7()
题意:已知一个函数可以uniformly randomly产生1-7,由此构造一个函数可以uniformly randomly产生1-10。首先rand7()+rand7()%4无法保证uniform,因为rand7()%4产生的0-3的概率就不是uniform的。这可以把rand7()和rand7()%4产生的所有组合列出来看一下,看看每个sample出现次数是否相等。用两个rand7(...
2018-10-18 13:42:46
288
原创 LeetCode 726. Number of Atoms
题意:给出一个化合物的化学式 eg, Mg(OH)2 and K4(ON(SO3)2)2,统计出其每个原子的个数很明显用递归做,如果遇到a(bcd)ef,则bcd构成一个子问题,递归处理统计出各个原子出现的频率(用map记录),如果e是个数字,返回后merge频率乘上该数字即可。但是需要保证先处理外面的括号,再处理内部的括号e.g., (a(bdc)e)。我把一块当做merge intev...
2018-10-13 18:47:09
325
原创 LeetCode 84. Largest Rectangle in Histogram
题意:给一组histogram bar,求构成的最大矩形面积。这一题和trap the rain很像。对于每一个bar,如果构成的矩形高度是以这个bar为基准,那么宽度取决于这个bar左边和右边第一个比其低的bar。给定一个bar a找到a右边第一个比其低的bar可以用单调队列实现。当a pop出去时,对应枚举到的位置b height比a低,所以应该维护一个单调升队列,这样b比a低时,需要...
2018-10-13 16:08:07
139
原创 LeetCode 632. Smallest Range
题意:给定k个排好序的数组,求出长度最小的range [l,r]使得每个数组至少有一个元素出现在range内。很明显的一个observation是l,r一定是数组中的数。如果只有一个数组,用两个pointer就OK。枚举r,随着r的增加,l不断右移保证cover所有的数组即可。开始在纠结一维数组中的r=r+1情况怎么对应到k个数组中。对于K个数组,这种case和merge k sort...
2018-10-13 16:00:04
331
原创 LeetCode 312. Burst Balloons
这一题和之前做过的acm一道题 HDU 5115 Dire Wolf 一样o(╯□╰)o 然而只记得做过。。题意:给定一组气球数组,每次删除气球得到的coin是当前气球和其相邻两个气球的乘积。问最多可以得到多少coin、很明显的区间DP。但一直纠结[i+1,..j-1]删除的某些气球得到的coin会乘上nums[i],nums[j],但又不知道哪些气球需要乘上nums[i],nums[j]...
2018-10-12 14:33:11
172
原创 Problem 3. Party Invitations 2018 Goldman Sachs Women's CodeSprint
题意:boss和employee的关系可以构成一棵树,树上每个节点是其子树的boss,和其ascent的employee。现在发送invitation,要求boss必须比其employee先收到,问有多少种发送invitaion的方式。结果要对1e7取模,一看就是排列组合推公式。推公式也是从树的递推关系入手,假设三个子树a,b,c有同一个parent,那么a,b,c之间是不会影响的。令其孩...
2018-10-10 19:45:32
289
原创 Problem 4. Stringonomics 2018 Goldman Sachs Women's CodeSprint
题意:输入字符串S和P,给定Q个queries,每个query操作将S[x]变成c,c也可能和原先的S[x]相同。保证每个位置x只改变一次,而且P不再是S的子串之后不会再重复出现,问对少个query之后P不会再出现S中。P是从出现到消失,正解是KMP+二分,二分每个mid处判断P是否是S的子串。但是我用O(QN)加上优化竟然也过了。。KMP一次比较后可以得出P在S中出现的所有位置(最末端匹...
2018-10-10 19:42:04
287
原创 Problem 5. Decimal Array Expansion 2018 Goldman Sachs Women's CodeSprint
题意:输入一个由0-9组成的字符串A,给定一组转换规则S,S[i]把数字i map到一个新的string,如此可将A一层一层扩展,直到长度>=M为止,给定一组query,求扩展后的字符串的区间和。这一题其实也没那么难,但是标了个hard,让人不战而败。。感觉自己还是不够confident + aggressive ε=(´ο`*)))唉扩展的过程类似于生成一棵树,第一层节点是A,然后...
2018-10-10 18:32:03
156
原创 LeetCode 486. Predict the Winner
题意:两个玩家player 1, player 2依次从一个数组头或者尾选一个数并移除,先手选的数总和大于等于后手则获胜,问先手能否获胜。博弈DP开始懵逼了,后来感觉都是套路。dp状态定义都是从先手是否赢入手,下一轮player 2会变成先手,然后根据player 2作为先手的得分算出palyer 1的得分。dp[i,j]表示数组[i,j]段player 1会得多少分,假如player 1...
2018-09-25 13:21:34
197
原创 LeetCode 568. Maximum Vacation Days
题意:有N个city可以travel,每个星期可以选择换一个city(或者停留在当前city),city之间可能连通也可能不连通。每个city可以travel的时间不同且每个星期不一样。一共K个星期,求最多可以travel的总天数。这一题看起来就很像DP,状态转移是从这周到下周,一个city到下一个city,因为转移时需要判断city是否连通,所以定义状态dp[i,j]为第j个星期时trave...
2018-09-19 20:12:32
525
原创 LeetCode 857. Minimum Cost to Hire K Workers
题意:N个worker中选K个,每个worker有quality和wage两个属性。雇佣K个worker需要保证每个人的报酬比例和quality比例相同,而且不得低于其wage。目标是付出的报酬最小。先考虑一个简单的情况,假设K个worker已经选定,如何定价格呢?假设有两个worker x, y, wage[x]/quality[x]<wage[y]/quality[y],那么把y的报...
2018-09-19 14:22:38
1349
原创 Problem C. Board Game Google Kickstart Round E 2018
题意:A与B各有3N个卡片,每场game时A随机把卡片分到3个battlefield里面。每个battlefield里如果A的卡片integer之和>=B的卡片integer之和,则A赢,反之B赢。赢的battlefield多的一方赢了这场game。问B在最优策略下平均赢几场比赛(期望值)。small input N=3,每个battlefield里面卡片是无序的,所以一共有C(9,3)...
2018-08-30 20:58:12
650
原创 Problem B. Milk Tea Google Kickstart Round E 2018
题意:给定N个二进制数,求出一个二进制数使得其和N个二进制数的complaint之和最小。complaint=不相同的bit的个数。另外有M个constraint,求出的二进制数不能出现在constraint中。如果没有constraint,最优解opt贪心即可求出来。假设sum[p]是N个二进制数bit p的1的个数之和,那么opt[p]=max(sum[p],N-sum[p])。入手点...
2018-08-30 20:47:00
807
原创 Problem A. Yogurt Google Kickstart Round E 2018
题意:给定N份酸奶,每份都有一个截止日期A[i],过期的酸奶 不能喝。每天最多只能喝K个。问什么策略可以喝到最多份酸奶。贪心即可。越快过期的酸奶越早喝最好,但是需要排除当天已经过期的酸奶。例如截止日期a<b,先喝a后喝b,b剩余的可等到时间比a长,所以多喝一份的可能性更大。极端情况:如果a当天过期,b第二天过期,先喝a可以喝两份,而先喝b只能喝一份。#include<iost...
2018-08-30 19:08:07
600
原创 Problem C. Matrix Cutting Google Kickstart Round G 2017
题意:给定一个M*N矩阵,需要按照横纵轴cut得到M*N个1*1的submatric,每次cut一次得到的coin是矩阵中最小数的值。求最优解是的得到的coin数最大。small input是一个vector,可以枚举分割的行数。large input想法类似,只不过改成dp,dp[a,b,c,d]表示左上角[a,b]右下角[c,d]的submatrix最优解的情况下得到的coin是多少。状态...
2018-08-26 11:30:17
205
原创 Problem B. Cards Game Google Kickstart Round G 2017
题意:有一组卡片,正反面的值是R[i],B[i],每次选择两个卡片i,j把min(R[i]^B[j],B[i]^R[j])加到value中,再将其中一个卡片放回,直到只剩一张卡片。问最优策略下最小的value是多少。small input可以用dp,状态用二进制数表示,比如N=5,10101表示余下第0,2,4个卡片,状态转移时枚举选取其中两个卡片,再放回去一个。large input真心...
2018-08-25 18:28:54
363
原创 Problem A. Huge Numbers Google Kickstart Round G 2017
题意:calculate the remainder when A^(N!) is divided by PA^n%P=(A*A*...*A)%P=(A%P)^nA^(N!)%P=A^(1*2*...*N)%P=((A%P)^2)^(3*...*N)=((remainder of (A%P)^2)^3)^(4*...*N)。由内向外维护一个remainder即可。#include...
2018-08-25 18:04:44
221
原创 Problem D. Eat Cake Google Kickstart Round F 2017
题意:给定一个数N,问N最少是多少个平方数的和。这种求最优值的问题90%都是裸的DP。。。dp[n]表示最少的组成n的平方数的个数。状态转移枚举平方数x和其出现的次数k,dp[n]=min(dp[n],dp[n-x*k])。因为平方数x最多100个,出现次数最多是10000/x,复杂度也是可以接受的。因为不同的N dparray值相同,可以先预处理求出dp array.#includ...
2018-08-25 17:49:23
216
原创 Problem A. Kicksort Google Kickstart Round F 2017
题意:quick sort中,pivot会将array分成两个sub array,worst case是一个sub array为空,另一个sub array 是N-1个。给定一个array(1~N全排列),问pivot是否一直都是worst case pivot。本来感觉直接模拟quick sort时间是够的,但最后large input内存爆了。。sample solution说需要手动增加...
2018-08-25 17:40:09
417
原创 Problem B. Trapezoid Counting Google Kickstart Round E 2017
题意:给定一组stick,问能拼成多少个等腰梯形。构成等腰梯形的条件是:四条边A,C,C,B,A<B and A+2*C>Bcase 1: A=C, 那么B<3C(B是较短边)or C<B<3C(B是较长边),对于B<3C,在sorted stick array L[maxn]中,二分找到最大的idx,L[idx]<3C,那么对应的B的取值即为id...
2018-08-25 17:04:32
292
原创 Problem B. Sherlock and The Matrix Game Google Kickstart Round D 2017 [Small input]
题意:给定两个vector A,B,相乘得到一个方阵,问该方阵子矩阵中第K大和的是多少。小数据先求出矩阵和前缀和,O(N^4)枚举子矩阵的端点。子矩阵的和可由前缀和+容斥原理O(1)求出。开始的想法是把所有的submatrix sum存在数组or vector里,sort之后再求出K-th largest。但后来发现vector会爆内存。非全局变量的数组不会爆内存但是sort复杂度是O(1e8...
2018-08-25 16:24:08
320
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人