Leetcode Contest 27
今晚肉特别多:红烧羊肉,焖排骨,手撕鸡和罗非鱼。
第一题Reverse Words in a String III
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
lst = s.split(' ')
for i in xrange(len(lst)):
if lst[i] == '':
continue
lst[i] = ''.join(reversed(lst[i]))
return ' '.join(lst)
第二题Brick Wall
我的想法:反过来想,我们可以求解劈的时候能避开切断砖头的最大行数,那么劈到砖头的最少数目就是砖的行数减去避开的最大行数。要避开切断砖头,那么就必须从两个砖头之间的缝隙切下去。所以我们就统计缝隙出现的位置就行。
class Solution(object):
def leastBricks(self, wall):
"""
:type wall: List[List[int]]
:rtype: int
"""
cnt = {}
for row in wall:
s = 0
for w in row[:-1]:
s += w
cnt[s] = cnt.get(s, 0) + 1
m = 0
for _, v in cnt.items():
m = max(m, v)
return len(wall) - m
第三题Next Greater Element III
这题不难,就是很多细节要注意。我就是一直没有注意细节,WA了5次 :disappointed: 我以一个例子说明我的做法吧。比如给定12443322,我们从倒数第二个数字出发,找到第一个比后面数字小的数。在这个例子里,应该是第二位的2,因为它比后面的4小。然后从这个2后面挑一个比2大的最小数,是3。然后交换2与3的位置得到13442322,最后将该3后面的数从小到大排序得到13222344。注意的是,新得到的数不能大于或者等于 231!!
class Solution(object):
def nextGreaterElement(self, n):
"""
:type n: int
:rtype: int
"""
d = []
m = n
while m > 0:
d.append(m % 10)
m /= 10
i = 1
while i < len(d) and d[i] >= d[i-1]:
i += 1
if i == len(d):
return -1
j = i
while j - 1 >= 0 and d[j-1] > d[i]:
j -= 1
d[i], d[j] = d[j], d[i]
d[:i] = sorted(d[:i], reverse=True)
p = 1
ans = 0
for i in d:
ans += i * p
p *= 10
return ans if ans < 2 ** 31 else -1
第四题Binary Tree Longest Consecutive Sequence II
我的想法:对于每个节点,递归算出从该节点往下的最长递增路径长度inc以及最长递减路径长度dec,那么经过该节点的最大长度是inc+dec-1。在所有的inc+dec-1中挑出最大值就好。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def longestConsecutive(self, root):
"""
:type root: TreeNode
:rtype: int
"""
ans = [0]
def dfs(root):
if not root:
return 0, 0
dec = inc = 1
if root.left:
d, i = dfs(root.left)
if root.val == root.left.val + 1:
dec = d + 1
elif root.val == root.left.val - 1:
inc = i + 1
if root.right:
d, i = dfs(root.right)
if root.val == root.right.val + 1:
dec = max(dec, d+1)
elif root.val == root.right.val - 1:
inc = max(inc, i+1)
ans[0] = max(ans[0], dec + inc - 1)
return dec, inc
dfs(root)
return ans[0]