167
题目描述:
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
示例:
解答:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
left=0
right=len(numbers)-1
while left<right:
if numbers[left]+numbers[right]==target:
return [left+1,right+1]
elif numbers[left]+numbers[right]<target:
left=left+1
else:
right=right-1
212
题目描述:
给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。
单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。
示例:
解答:
class Solution:
def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
res = set()
if len(board) < 1 or len(words) < 1:
return []
trie = Trie()
for word in words:
trie.insert(word)
n = len(board)
m = len(board[0])
def backtrack(i, j, tmp, flags, node):
if node.get("is_word", False):
res.add(tmp[:])
for x, y in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
ii = i + x
jj = j + y
if 0 <= ii < n and 0<=jj < m and flags[ii][jj] == 0 and board[ii][jj] in node.keys():
flags[ii][jj] = 1
backtrack(ii, jj, tmp + board[ii][jj], flags, node[board[ii][jj]])
flags[ii][jj] = 0
return
for i in range(n):
for j in range(m):
if board[i][j] in trie.root.keys():
flags = [[0]*m for _ in range(n)]
flags[i][j] = 1
node = trie.root[board[i][j]]
backtrack(i, j, board[i][j], flags, node)
return list(res)
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
self.root = {}
def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
node = self.root
for s in word:
if s in node.keys():
node = node[s]
else:
node[s] = {}
node = node[s]
node["is_word"] = True
617
题目描述:
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if t1 and t2:
t1.val+=t2.val
t1.left=self.mergeTrees(t1.left,t2.left)
t1.right=self.mergeTrees(t1.right,t2.right)
return t1
return t1 or t2
888
题目描述:
爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。
示例:
解答:
class Solution:
def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
'''
sum(A)+y-x=sum(B)-y+x
sum(A)-sum(B)=2(x-y)
(x-y)=(sum(A)-sum(B))//2
x是A中元素,y是B中元素
'''
dif=(sum(A)-sum(B))//2
s=set(B)
for x in A:
y=x-dif
if y in s:
return [x,y]
1496
题目描述:
给你一个字符串 path,其中 path[i] 的值可以是 ‘N’、‘S’、‘E’ 或者 ‘W’,分别表示向北、向南、向东、向西移动一个单位。
机器人从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。
如果路径在任何位置上出现相交的情况,也就是走到之前已经走过的位置,请返回 True ;否则,返回 False 。
示例:
解答:
class Solution:
def isPathCrossing(self, path: str) -> bool:
x,y=0,0
ret=[(0,0)]
for i in path:
if i=='N':
y+=1
elif i=='S':
y-=1
elif i=='E':
x+=1
elif i=='W':
x-=1
if (x,y) in ret:
return True
else:
ret.append((x,y))
return False