leettcode 第132周賽題解

2021-09-18 04:33:02 字數 4380 閱讀 1323

題目描述

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。

最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作:

選出任一x,滿足0 < x < nn % x == 0

n - x替換黑板上的數字n

如果玩家無法執行這些操作,就會輸掉遊戲。

只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲

解題思路

很少做博弈題,第乙個是17分鐘才a,果然還是菜,這個題是讓判斷能否存在乙個n的因數i,使得n - i 的局面下先出手必輸,因此直接動態規劃好了,我們將輸定義為 0,贏定義為1,初始的dp陣列全為0, 從2到n遍歷陣列。

乙個詭異的做法是 直接判斷 n&1 == 0 等於0就是贏,不等就是輸。。。應該和數學有關。

** python

class solution:

def divisorgame(self, n: int) -> bool:

l = [0] * (n+1)

for i in range(2, n+1):

for j in range(1, int(i ** 0.5) + 1):

if not i % j:

l[i] |= 1-l[i-j]

#print(l)

return bool(l[-1])

題目描述

給定二叉樹的根節點root,找出存在於不同節點ab之間的最大值v,其中v = |a.val - b.val|,且ab的祖先。

(如果 a 的任何子節點之一為 b,或者 a 的任何子節點是 b 的祖先,那麼我們認為 a 是 b 的祖先)

解題思路

對於乙個節點來說,這個節點的最大距離max(abs(子節點的最小值 - 節點值), abs(子節點最大值 - 節點值)),對於其子節點來說同樣如此。max(所有節點的最大距離)就是答案,因此我們在遍歷二叉樹的時候不僅要算當前節點的最大距離,還要返回以當前節點為根的子樹的最大,最小值,以便讓其父節點也能計算最大距離。

** python

class solution:

def maxancestordiff(self, root: treenode) -> int:

res = 0

def helper(root):

nonlocal res

if not root:

return float('inf'), -float('inf')

_minl, _maxl = helper(root.left)

_minr, _maxr = helper(root.right)

_min = min(_minl, _minr)

_max = max(_maxl, _maxr)

if _min != float('inf'):

res = max(res, abs(root.val-_min), abs(root.val-_max))

return min(_min, root.val), max(_max, root.val)

helper(root)

return res

題目描述

給定乙個整數陣列a,返回a中最長等差子串行的長度

回想一下,a的子串行是列表a[i_1], a[i_2], ..., a[i_k]其中0 <= i_1 < i_2 < ... < i_k <= a.length - 1。並且如果b[i+1] - b[i](0 <= i < b.length - 1) 的值都相同,那麼序列b是等差的。

解題思路

這個題在比賽的時候沒答上來,感覺要用動態規劃,但是dp方程沒找到,看了看別人的**,果然是動態規劃

狀態的定義很關鍵, 首先我們要考慮對於第i個數字num。它的最長等差數列怎麼求,肯定要逐一與前面的數做差diff,然後看看前面的數在diff為差的等差數列 加 一 是不是大於當前的長度。因此狀態的定義就呼之欲出了。這是一種由區域性到整體的思維方式,遮蔽得全域性的複雜性,關注區域性。

dp[i][j]為以第i個數為結尾,差值為j的等差數列的長度

** python

class solution:

def longestarithseqlength(self, a):

from collections import defaultdict

n = len(a)

dp = [defaultdict(int) for _ in range(n)]

res = 0

for i in range(n):

for j in range(i+1, n):

diff = a[j] - a[i]

dp[j][diff] = max(dp[j][diff], 2, dp[i][diff] + 1)

res = max(dp[j][diff], res)

return res

題目描述

我們從二叉樹的根節點root開始進行深度優先搜尋。

在遍歷中的每個節點處,我們輸出d條短劃線(其中d是該節點的深度),然後輸出該節點的值。(如果節點的深度為d,則其直接子節點的深度為d + 1。根節點的深度為0)。

如果節點只有乙個子節點,那麼保證該子節點為左子節點。

給出遍歷輸出s,還原樹並返回其根節點root

解題思路

二叉樹的先序遍歷,二叉樹的題一定要在紙上手算幾遍,比較容易找規律,這道題雖然是hard但並不難。

根據 '-'的個數以及當前節點的深度來判斷下個節點是否為當前的節點的子節點,如果'-'的個數是當前結的深度+1就是子節點,繼續遍歷,如果不是就說明當前節點已經沒有子節點了,返回上一層。

幾點需要注意:數字可能是不止於一位,當節點沒有左子樹時,一定也沒有右子樹

**好醜= =、

** python

class solution:

def recoverfrompreorder(self, s: str) -> treenode:

i, n = 0, len(s)

def helper(d):

nonlocal i

num = 0

while i < n and s[i] != '-':

num = num * 10 + int(s[i])

i += 1

root = treenode(num)

if i == n:

return root

count = 0

while s[i] == '-':

i += 1

count += 1

if count > d:

root.left = helper(count)

count = 0

while s[i] == '-':

i += 1

count += 1

if count > d:

root.right = helper(count)

else:

i -= count

else:

i -= count

return root

return helper(0)

第一次參加周賽,有點小緊張,第一題做的很慢,我看前幾名都是幾分鐘就做出來的我想如果自己冷靜讀幾遍題不用在紙上找規律應該做的更快,第三個題如果冷靜下應該可以做出來,在紙上亂塗亂畫了好久也沒有思路,看到時間差不多了趕緊換下一道的策略還是對的。第四題提交了兩次才過,考慮不夠細緻周到。加油!有生之年進個前十哈哈~

leetcode 第132場周賽

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...

Leetcode第132場周賽題目學習

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例1 輸入 2 輸出 true 解釋 ...

第148周周賽

給你乙個整數陣列nums,每次操作會從中選擇乙個元素並將該元素的值減少 1。如果符合下列情況之一,則陣列a就是鋸齒陣列 返回將陣列nums轉換為鋸齒陣列所需的最小操作次數 我的思路以為是dp,想了半天的狀態轉移方程未果,最後結束看了別人的 自己用python寫的 class solution obj...