Leetcode 第147場周賽題目學習

2021-09-25 18:22:27 字數 3987 閱讀 5226

泰波那契序列 tn 定義如下:

t 0=

0,t1

=1,t

2=1,

且在

n>=0

的條件下

tn+3

=tn+

tn+1

+tn+

2t_ = 0, t_ = 1, t_ = 1, 且在 n >= 0 的條件下 t_ = t + t_ + t_

t0​=0,

t1​=

1,t2

​=1,

且在n>=0

的條件下

tn+3

​=tn

​+tn

+1​+

tn+2

​給你整數n,請返回第 n 個泰波那契數 tnt_

tn​的值。

示例 1:

輸入:n = 4

輸出:4

解釋:t_3 = 0 + 1 + 1 = 2

t_4 = 1 + 1 + 2 = 4

示例 2:

輸入:n = 25

輸出:1389537

與求解斐波那契數列的第n項的思路相同,採用遞推的方式進行求解。

需要注意的是,答案是乙個32位整數,因此需要用unsigned int儲存答案,如果用int儲存,可能會發生越界。

class

solution

return ans;}}

;

我們從一塊字母板上的位置(0, 0)出發,該座標對應的字元為board[0][0]

在本題裡,字母板為board = ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"].

我們可以按下面的指令規則行動:

返回指令序列,用最小的行動次數讓答案和目標target相同。你可以返回任何達成目標的路徑。

示例 1:

輸入:target = "leet"

輸出:"ddr!uurrr!!ddd!"

示例 2:

輸入:target = "code"

輸出:"rr!ddrr!uul!r!"

由於僅能上下左右移動,實際上給定單詞的指令序列長度是一定的。而且題目中並未規定輸出指令的順序,因此只要明確兩個字母間的橫向和縱向距離差即可輸出相應的指令。

由於字母板最後一行僅有乙個字母z,因此若想移動到z,僅能從第5行的u向下移動到z。若想從z移動到其他字母,只能先從z開始向上移動,隨後再進行左右移動。因此,若目的地是z,則先執行左右移動的指令,再執行上下移動的指令;若起點是z,則先執行左右移動的指令,再執行上下移動的指令。

本題中無需構建出字母板,只需要計算各字母間座標,求出目標點和起始點之間的座標的相對大小即可:

int xi =

(x -

'a')/5

;int xj =

(x -

'a')%5

;int curi =

(cur -

'a')/5

;int curj =

(cur -

'a')%5

;deltai = xi - curi;

deltaj = xj - curj;

若偏移量大於0,則執行下/右移動,若偏移量小於0,則執行上/左移動。

char row[2]

=;char col[2]

=;class

solution

else

ans +

='!'

; cur = x;

}return ans;

}void

calculate

(char x,

char cur,

int& deltai,

int&deltaj)

};

給你乙個由若干01組成的二維網格grid,請你找出邊界全部由1組成的最大正方形子網格,並返回該子網格中的元素數量。如果不存在,則返回0

示例 1:

輸入:grid = [[1,1,1],[1,0,1],[1,1,1]]

輸出:9

示例 2:

輸入:grid = [[1,1,0,0]]

輸出:1

本題可利用滑動視窗法進行檢測。具體過程結合參考**分析。

class

solution

}int len=

min(m,n)

;for

(i=1

;i<=n;i++)}

}return ans*ans;}}

;

分析:

s1和s2分別是每行元素的累積和與每列元素的累積和。若當前行全為1,則累積和的最後乙個元素應等於列的數目。

隨後進行滑窗檢測。滑窗左上角的起始點為(i,j),滑窗的邊長為k。根據起點和k可以得出行的起點和終點為[l1,r1],列的起點和終點為[l2,r2]。隨後進行5項檢測:

當前滑窗邊長小於已經獲得的邊長,則無需進行此次檢驗

當前最上邊的累積和不等於滑窗邊長k,則跳過

當前最下邊的累積和不等於滑窗邊長k,則跳過

當前最左邊的累積和不等於滑窗邊長k,則跳過

當前最右邊的累積和不等於滑窗邊長k,則跳過

如果當前獲得的結果等於網格的長寬中最小值,說明已經獲得最大網格,則可直接退出檢測。

亞歷克斯和李繼續他們的石子遊戲。許多堆石子排成一行,每堆都有正整數顆石子piles[i]。遊戲以誰手中的石子最多來決出勝負。

亞歷克斯和李輪流進行,亞歷克斯先開始。最初,m = 1

在每個玩家的回合中,該玩家可以拿走剩下的x堆的所有石子,其中1 <= x <= 2m。然後,令m = max(m, x)

遊戲一直持續到所有石子都被拿走。

假設亞歷克斯和李都發揮出最佳水平,返回亞歷克斯可以得到的最大數量的石頭。

示例:

輸入:piles = [2,7,9,4,4]

輸出:10

解釋:如果亞歷克斯在開始時拿走一堆石子,李拿走兩堆,接著亞歷克斯也拿走兩堆。在這種情況下,亞歷克斯可以拿到 2 + 4 + 4 = 10 顆石子。

如果亞歷克斯在開始時拿走兩堆石子,那麼李就可以拿走剩下全部三堆石子。在這種情況下,亞歷克斯可以拿到 2 + 7 = 9 顆石子。

所以我們返回更大的 10。

(暫時不懂)

第一種方法(不理解其動態規劃)

class

solution

}return dp[1]

[1];

}};

第二種方法
class

solution

}return dp[0]

[0];

}};

leetcode 第132場周賽

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

leetcode周賽 第176場

題目描述 給你乙個 m n 的矩陣 grid,矩陣中的元素無論是按行還是按列,都以非遞增順序排列。請你統計並返回 grid 中 負數 的數目。示例 1 輸入 grid 4,3,2,1 3,2,1,1 1,1,1,2 1,1,2,3 輸出 8 解釋 矩陣中共有 8 個負數。示例 2 輸入 grid 3...

leetcode 第 180 場周賽

大佬都是3 5分鐘一題,而我10分鐘一題,最後一題還不會。qaq 5356.矩陣中的幸運數 給你乙個m n的矩陣,矩陣中的數字各不相同。請你按任意順序返回矩陣中的所有幸運數。幸運數是指矩陣中滿足同時下列兩個條件的元素 class solution object def luckynumbers se...