402. Remove K Digits: 利用stack保存单调增序列。
406. Queue Reconstruction by Height: 一道greedy的问题,greedy的问题一般就是先排排序,或者利用一下heap来保持顺序。
413. Arithmetic Slices: 用二维dp作出一个TLE版本。如果直接数数也可以,就用类似于前向型指针,记录每一段的最长长度,然后针对每一个最长长度做一个数学运算就可以了。
416. Partition Equal Subset Sum: 想法倒是很简单,只要找到一个subset的和为总和的一半。做了一个backtracking的解法,TLE。喵了一眼答案,竟然可以用DP,研究下。结果是背包问题。那么问题来了,是否求和型的backtracking很多都可以用背包问题来解呢?不过DP问题比较适合求最大,最小,总量,能否这类问题。
417. Pacific Atlantic Water Flow: 就是做两次BFS
418. Sentence Screen Fitting: 这道题看着并不难,但是。。。做起来总是做不对。。。感觉不用dp也可以做,不过好像有点问题
419. Battleships in a Board: 对每一个X,验证一下左上的元素。
421. Maximum XOR of Two Numbers in an Array:可以利用Trie来做,但是时间复杂度会比较高,另一种方式是:Build the answer bit by bit from left to right. Let's say we already know the largest first seven bits we can create. How to find the largest first eight bits we can create? Well it's that maximal seven-bits prefix followed by 0 or 1. Append 0 and then try to create the 1 one (i.e., answer ^ 1) from two eight-bits prefixes from nums. If we can, then change that 0 to 1.
class Solution(object):
def findMaximumXOR(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res, mask = 0, 0
for i in xrange(31, -1, -1):
mask |= (1 << i) # mask 是11111000
lst = set()
for num in nums:
lst.add(num & mask) # 所有的数字的前五位的值
candidate = res | (1 << i) # res就是当前构造出来的值
for prefix in lst:
if (candidate ^ prefix) in lst: # 这里利用一个特点A^B=C => A^C=B
res = candidate
break
return res
423. Reconstruct Original Digits from English: 有点扯,利用各个字符的特殊性来做
424. Longest Repeating Character Replacement:这题也是一道前向型指针问题,利用模板,找到合适的validation函数,竟然做出来了。看来上上课,学习学习模板还是挺有用的。