700バイナリ検索ツリーの検索 - ツリー
二分探索木(BST)と値のルートを考えます。あなたはノードがBST内の指定されたノードの値に等しい見つける必要があります。ノードをルートとするサブツリーへ戻ります。ノードが存在しない場合は、NULLが返されます。
アイデア:
二分探索木の特性は左のルートよりも小さく、かつ、右ルートよりも大きくなっています。そして、ターゲットノード、三つの可能性があります:
1.日本ルートとしては、その後、根に直接戻ります。
2.ルートよりも値が小さい場合、検索は、左のサブツリー時間に行く必要があります。
3.大型の根よりも値が、それは再び右のサブツリー検索に行く必要があります。
私は、これは再帰的な考え方である見ることができます。
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return
if val == root.val:
return root
# 比根的值小就去左子树
if val < root.val:
lres = self.searchBST(root.left, val)
if lres: return lres
# 否则就去右子树
if val > root.val:
rres = self.searchBST(root.right, val)
if rres: return rres
return None
671第2小バイナリツリーノード - ツリー
非ヌルバイナリ特定の所定のノードの各々は正であり、各ノードの子ノードの数は、0又は2であることができます。ノードが2つのつの子ノードを持っている場合、このノードの値は、その子ノードの値よりも大きくありません。
バイナリツリーを考えると、あなたは出力に、すべてのノードで第2小値を必要とします。第2小値が存在しない場合は、-1の出力。
アイデア:
(非常に賢い方法のemmmを考えていませんでした)
直接BFSはツリーをトラバース、根は値は、特定の、ルートよりも大きいか、親ノードに等しいので、タイトルの子ノードの値に記載された条件の(保存されているよりも大きくなりますこれらの値は、それ以外の場合は存在しない、特定の最小値は第二最小で存在している場合、)が最小です。
# self.right = None
class Solution:
def findSecondMinimumValue(self, root: TreeNode) -> int:
if not root:
return -1
Q = [root]
res = []
while len(Q) != 0:
node = Q.pop(0)
if node.val > root.val:
res.append(node.val)
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
if len(res) == 0:
return -1
return min(res)
653二つの数IVの合計-入力BST -ツリー- > ダブルポインタ
バイナリ検索ツリーとターゲット結果を考えると、そこBST内の2つの要素があり、その合計が所定の目標結果に等しい場合、それはtrueを返します。
アイデア:
(2つのだけの数字を思い付いた問題への解決策を読んで...と、問題は定期的に、ダブルポインタに関連すると思わ)
それは二分探索木であるので、そのためのトラバーサル結果に昇順です。メソッドの前提ダブルポインタがシーケンスをインクリメントして、ヘッドポインタは、テールへのポインタは、常に移動ポインタは二つの条件か否かが判断されます。
class Solution:
def findTarget(self, root: TreeNode, k: int) -> bool:
inRes = []
# 中序遍历
def Inorder(root):
if not root:
return
Inorder(root.left)
inRes.append(root.val)
Inorder(root.right)
Inorder(root)
# 双指针
head = 0; tail = len(inRes) - 1
while head < tail:
res = inRes[head] + inRes[tail]
# 如果大于目标值,就让尾指针左移
if res > k:
tail -= 1
# 如果小于目标值,就让头指针右移
if res < k:
head += 1
if res == k:
return True
return False
965単一値のバイナリツリー - ツリー
バイナリツリーの各ノードが同じ値を有する場合、単一の二分木の値は二分木です。
のみ与えられた木は、それがtrueを返し、単一のバイナリ値であり、そうでない場合はfalse。
アイデア:
ツリーをトラバースして、再び、ここでレベルを横断し、異なる値の出現のルートの値は、それが絶対的に単一の値ではありませんいつでもできます。
class Solution:
def isUnivalTree(self, root: TreeNode) -> bool:
if not root:
return False
Q = [root]
check = root.val
while len(Q) != 0:
node = Q.pop(0)
if node.val != check:
return False
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
return True
友人の547円 - DFS - >通信ブロックの数を数えます
クラスN.の学生があります。それらのいくつかが友達である、いくつかはそうではありません。彼らの友情は推移でいます。あなたはAの友人Bを知っている場合は、B、Cは友人であるので、我々は、AはCの友人であると仮定することができます。友人のいわゆる円は、すべてのあなたの友人のセットです。
N * N行列Mを考えると、クラスの高校生との友情を表しています。もしM [i]の[J] = 1、そうでない場合は私は知らない、知られているi番目とj番目の生徒相互の友情を表しています。あなたは友人の既知の円の合計数は、すべての学生にエクスポートする必要があります。
アイデア:
ダイレクトDFSのテンプレートセットには、いくつかのDFS作ら総合判定に相当することができます。
この問題の本質は、図中のいくつかの通信要求ブロックがあるということです。
class Solution:
def findCircleNum(self, M: List[List[int]]) -> int:
res = 0
vis = set()
# 每一次的DFS都会把属于同一个朋友圈的人加上vis中
def DFS(node):
vis.add(node)
for i in range(len(M[node])):
if M[node][i] == 1 and i not in vis:
DFS(i)
for i in range(len(M)):
# 剩下的没有被加入vis中才会再次进行DFS
if i not in vis:
DFS(i)
res += 1
return res
DFS - すべての組み合わせを見つけます
473試合のスペル広場 - 繰り返しで
少女はマッチの数は、各マッチが、その長さによって示される入力を有します。あなたはすべての試合が正方形のスペルを使用できるかどうかで出力。
入力:[1,1,2,2,2-]
出力:真
の解釈:缶が2の正方形の辺の長さが、それぞれの側の試合の2を占めます。
入力:[3,3,3,3,4]
出力:偽
の解釈:すべての正方形が一致しない構成します。
アイデアは:
各試合のためにと、それは(別のマッチが同じ側に行くことができます)に行くことができる4つの辺を有しているので、長い間、各プットはすべてのマッチの組み合わせを解決しているかどうかを知るために参照することができます広場
"""
DFS遍历所有可能性
本题剪枝很重要,不然会很容易超时。
"""
class Solution:
def makesquare(self, nums) -> bool:
# 如果数组和不是4的倍数,一定不能拼成正方形
sumRes = sum(nums)
if len(nums) < 4 or sum(nums) % 4 != 0:
return False
# 若有一个数大于数组和/4,也一定不能拼成正方形
check = sumRes // 4
nums.sort(reverse=True)
if nums[0] > check:
return False
# 遍历每根火柴loc为该跟火柴的下标,square为正方形的各个边
def DFS(loc, square):
if len(set(square)) == 1 and 0 not in square and loc == len(nums):
return True
if loc > len(nums) -1:
return
# 每根火柴有四个地方可以放置
for i in range(4):
if square[i] + nums[loc] <= check:
square[i] += nums[loc]
# 让下一个位置的火柴去放
if DFS(loc + 1, square):
return True
# 表示不应该放在这个位置
square[i] -= nums[loc]
return False
return DFS(0, [0, 0, 0, 0])
46. Aフルアレイ - ない繰り返します
与えられた数字の配列は、完全な順列にすべての可能なリターンを繰り返されていません。
思考:
DFSルーチン、(存在するn個の数字、N位置)である数は一箇所に属する一の構成では、それぞれが有するn個のデジタル位置を選択することができます。
class Solution:
def permute(self, nums):
vis = set()
r = []
def DFS(loc, res):
if loc == len(nums):
r.append(res.copy())
# 每个位置n个数字
for i in nums:
if i not in vis:
vis.add(i)
res[loc] = i
DFS(loc + 1, res)
vis.remove(i)
DFS(0, [0] * len(nums))
return sorted(r)