给A,B两个list,其中的元素相同顺序不同,求一个list来表示A中的第i个元素在B中哪个位置
For example, given
A = [12, 28, 46, 32, 50] B = [50, 12, 32, 46, 28]
We should return
[1, 4, 3, 2, 0]as
P[0] = 1
because the
0
th element of
A
appears at
B[1]
, and
P[1] = 4
because the
1
st element of
A
appears at
B[4]
, and so on.
我的代码:
class Solution(object):
def anagramMappings(self, A, B):
"""
:type A: List[int]
:type B: List[int]
:rtype: List[int]
"""
ans = []
for i in range(len(A)):
ind = B.index(A[i])
ans.append(ind)
B[ind] = None
return ans
有个用哈希表的代码:
def anagramMappings(self, A, B):
d = {}
for i, b in enumerate(B):
if b not in d:
d[b] = []
d[b].append(i)
return [d[a].pop() for a in A]
257. Binary Tree Paths
给出一个二叉树从根到每个叶点的路径
For example, given the following binary tree:
1 / \ 2 3 \ 5
All root-to-leaf paths are:
["1->2->5", "1->3"]我的代码:
# 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 binaryTreePaths(self, root):
"""
:type root: TreeNode
:rtype: List[str]
"""
ans = []
def dfs(node,cur = ''):
if node:
cur = cur + str(node.val)
if node.left or node.right:
dfs(node.left,cur + '->')
dfs(node.right,cur + '->')
elif not node.left and not node.right:
ans.append(cur)
dfs(root)
return ans
有全能型大神:
# dfs + stack
def binaryTreePaths1(self, root):
if not root:
return []
res, stack = [], [(root, "")]
while stack:
node, ls = stack.pop()
if not node.left and not node.right:
res.append(ls+str(node.val))
if node.right:
stack.append((node.right, ls+str(node.val)+"->"))
if node.left:
stack.append((node.left, ls+str(node.val)+"->"))
return res
# bfs + queue
def binaryTreePaths2(self, root):
if not root:
return []
res, queue = [], collections.deque([(root, "")])
while queue:
node, ls = queue.popleft()
if not node.left and not node.right:
res.append(ls+str(node.val))
if node.left:
queue.append((node.left, ls+str(node.val)+"->"))
if node.right:
queue.append((node.right, ls+str(node.val)+"->"))
return res
# dfs recursively
def binaryTreePaths(self, root):
if not root:
return []
res = []
self.dfs(root, "", res)
return res
def dfs(self, root, ls, res):
if not root.left and not root.right:
res.append(ls+str(root.val))
if root.left:
self.dfs(root.left, ls+str(root.val)+"->", res)
if root.right:
self.dfs(root.right, ls+str(root.val)+"->", res)
也有简洁型大神:这个真的有点难懂
def binaryTreePaths(self, root):
if not root:
return []
return [str(root.val) + '->' + path
for kid in (root.left, root.right) if kid
for path in self.binaryTreePaths(kid)] or [str(root.val)]
27. Remove Element
在原列表nums中移除值为val的元素,应返回一个长度l,nums的前l个元素不为val
Example:
Given nums = [3,2,2,3], val = 3, Your function should return length = 2, with the first two elements of nums being 2.我的代码:
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
start,end = 0,len(nums)-1
while start <= end:
if nums[start] == val:
nums[start] ,nums[end] = nums[end],nums[start]
end -= 1
else:
start += 1
return start
437. Path Sum III
给出一个二叉树和一个值,求这个树种所有路径之和为值的路径个数
Example:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 Return 3. The paths that sum to 8 are: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11我的代码:
# 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 pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
def dfs(node,sum_ = 0):
if not node:
return 0
sum_ =sum_ + node.val
if sum_ == sum:
return 1 + dfs(node.left, sum_ = sum_) + dfs(node.right,sum_ = sum_)
else:
return dfs(node.left, sum_ = sum_) + dfs(node.right,sum_ = sum_)
if not root:
return 0
if root:
return dfs(root)+self.pathSum(root.left,sum)+self.pathSum(root.right,sum)
除了我这个代码的简洁版:
class SolutionBruteForce(object):
def find_paths(self, root, target):
if root:
return int(root.val == target) + self.find_paths(root.left, target-root.val) + self.find_paths(root.right, target-root.val)
return 0
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
if root:
return self.find_paths(root, sum) + self.pathSum(root.left, sum) + self.pathSum(root.right, sum)
return 0
还有一个优化版
class Solution(object):
def helper(self, root, target, so_far, cache):
if root:
complement = so_far + root.val - target
if complement in cache:
self.result += cache[complement]
cache.setdefault(so_far+root.val, 0)
cache[so_far+root.val] += 1
self.helper(root.left, target, so_far+root.val, cache)
self.helper(root.right, target, so_far+root.val, cache)
cache[so_far+root.val] -= 1
return
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
self.result = 0
self.helper(root, sum, 0, {0:1})
return self.result
766. Toeplitz Matrix
判断一个二维矩阵是否中心斜线对称
Example 1:
Input: matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]] Output: True Explanation: 1234 5123 9512 In the above grid, the diagonals are "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]", and in each diagonal all elements are the same, so the answer is True.
Example 2:
Input: matrix = [[1,2],[2,2]] Output: False Explanation: The diagonal "[1, 2]" has different elements.
我的代码:
class Solution:
def isToeplitzMatrix(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: bool
"""
for i in range(len(matrix)-1):
if matrix[i][:-1] != matrix[i+1][1:]:
return False
return True
大神的一行版:
class Solution(object):
def isToeplitzMatrix(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: bool
"""
return all(matrix[row+1][1:] == matrix[row][:-1] for row in range(len(matrix)-1))
21 . Merge Two Sorted Lists
按值的顺序合并两个自定义列表
Example:
Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4我的代码:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
ans = ListNode(None)
current = ans
while l1 or l2:
if not l1:
current.next = l2
return ans.next
if not l2:
current.next = l1
return ans.next
if l1.val <= l2.val:
current.next = ListNode(l1.val)
l1 = l1.next
else:
current.next = ListNode(l2.val)
l2 = l2.next
current = current.next
return ans.next
大神的代码:三个版本
# iteratively
def mergeTwoLists1(self, l1, l2):
dummy = cur = ListNode(0)
while l1 and l2:
if l1.val < l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
cur.next = l1 or l2
return dummy.next
# recursively
def mergeTwoLists2(self, l1, l2):
if not l1 or not l2:
return l1 or l2
if l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
# in-place, iteratively
def mergeTwoLists(self, l1, l2):
if None in (l1, l2):
return l1 or l2
dummy = cur = ListNode(0)
dummy.next = l1
while l1 and l2:
if l1.val < l2.val:
l1 = l1.next
else:
nxt = cur.next
cur.next = l2
tmp = l2.next
l2.next = nxt
l2 = tmp
cur = cur.next
cur.next = l1 or l2
return dummy.next