Reconstruct Original Digits from English:
给定一组乱序的字符串,是由zero、one、two......到nine的所有字母乱序组成,求对应的升序数字串。如给定,owoztneoer,对应012。
这道题是我自己想复杂了,想着找到每个数字的unique number,然后贪心搜索。其实先把几个有独一无二字符的数字找出来(如:six的x即是独一无二),然后再根据这些数字,减去重复的字符,即可得到剩下那几个数字的个数。
Different Ways to Add Parentheses:
给出一个数字和运算符的字符串如2*3-4*5,求一共有多少种通过加括号得到的答案,如2*((3-4)*5)。这道题其实还是比较简单,是自己想复杂了。如果分治的话,就直接以运算符进行划分,前后两段继续分治,算出所有结果,再把结果根据当前运算符进行运算。
另外还可以用DP,状态方程是:DP[i][j] = set of (DP[i][k]
OP DP[k+1][j])
也就是说每次计算从num i到j有多少种结果时,要把DP[i][k]中的每一个数和DP[k+1][j]中的每一个数逐个
做OP操作。
4Sum ii:
感觉做到求和问题的终极boss了,给定四个数组,求有多少种取法,使得从4个数组中各取一个数,和为0。
如果还是按照原来的方法,遍历两个再用left、right找另外两个,妥妥的会超时。
其实这道题要根据题意,它只需要求出有多少个组合,并不需要求出具体是哪些组合,于是我们可以用map来做,ab两个数组相加一共有多少个数,cd相加又有多少个,用map储存每个数一共出现了多少次,然后把abmap和cdmap做比较,有相反的数就把出现次数相乘,累加得到的就是答案。
另外,这样做还是可能超时,要用一些优化:
1、不要用find函数,如数字x没出现过,那么必然map[x]==0,加到答案里面去也不会影响结果。
2、
不要用map,用unordered_map,前者是
顺序存储,通过关键字查找时会进行遍历,后者是
hash存储,直接通过关键值的hash值查找,速度会快很多。本来用map我的时间是1600ms,差点超时,换成unordered_map后,直接降低到700ms