Leetcode 第135場周賽解題報告

2021-09-22 23:13:03 字數 3630 閱讀 6215

這周比賽的題目很有特點。幾道題都需要找到一定的技巧才能巧妙解決,和以往靠資料結構的題目不太一樣。

就是如果懂原理,**會很簡單,如果暴力做,也能做出來,但是十分容易出錯。

第四題還挺難想的,想了好久才想明白。這次先講第四題,然後再講其他的題目。

下面是詳細的題解和思考。

比賽的位址 weekly contest 135

題目:移動石子直到連續 ii(moving stones until consecutive ii)

/problems/moving-stones-until-consecutive-ii/

題意:

在數軸上擺放了n個石子,石子位置都是整數,並且不能重疊。遊戲規則是:每個回合,將一顆端點石子拿起並移動到乙個未占用的位置,使得該石子不再是一顆端點石子。無法移動時遊戲停止。

問最小和最大移動次數分別是多少。

思路:

題目是上週第一題的擴充套件,但是有點不同。

由題意可知,每進行一輪操作,石子的左右端點的距離會縮短,一輪一輪收斂。最後會石子都緊鄰遊戲結束。

舉個例子:

初始時有8顆石子,在數軸上的有石子的刻度為:

4,6,8,9,15,16,19,20

最大值求解方法:

石子可以放置的空間,等於左右兩端石子之間的未占用位置。在例子中,一共有20-4+1-8個位置。

石子覆蓋的線段長度是20-4個,加上乙個端點的位置即20-4+1,再減去已經占用的8個位置。

用公式表示為

s1=stones[n-1]-stones[0]+1-n

但是第一次移動的左端點或右端點的石子後,這個移動的石子和它相鄰的那顆石子之間的空間,後面就不能被放置了,因為與他相鄰的那個點變為端點,他們之間的位置不可以被放置了。

例如第一步移動了4,那麼5這個位置就不可能放置石子了。所以要計算不能被訪問的空間

s2=min(stones[n-1]-stones[n-2]-1, stones[1]-stones[0] -1)

最大值為s1-s2。因為在後面的步驟裡,我們都可以做出策略,讓每一輪左右端點的差值只減1。

最小值求解方法:

如果最後遊戲結束,那麼一定有n個連續座標擺滿了石子。如果我們要移動最少,必定要找乙個石子序列,使得在n大小連續的座標內,初始時有最多的石子。

設想有個尺子,上面有n個刻度點,我們用這個尺子在石子從最左邊到最右邊移動,每動一次都檢視下在尺子範圍內有m個石子,那麼要使這個區間填滿,就需要移動n-m次。

只要在尺子外部有石子,就有策略填滿尺子內的。

這些次數中最小的就為雖少次數。

但是有一種特例:

1,2,3,4,7

這種1-4是最好的序列,但是7不能移動到端點,只能1先移動到6,然後7移動到5解決,這種情況要用2步。就是尺子內的石子都是連續的,中間沒空洞,只在邊上有空,要用2次。

**:

class solution 

return vector;}};

題目:有效的迴旋鏢(valid boomerang)

/problems/valid-boomerang/

題意:

迴旋鏢定義為一組三個點,這些點各不相同且不在一條直線上。

給出平面上三個點組成的列表,判斷這些點是否可以構成迴旋鏢。

思路:題目說是迴旋鏢,其實就是三角形。只要能判斷三點不共線就可以。

方法一:簡單的想法可以用斜率和截距的方法,判斷三點共線。

缺點:要用到除法,可能有精度問題,而且要考慮和座標軸平行的特殊情況。

方法二:利用三角形變長的性質,兩邊之和大於第三邊。

缺點:也存在用開方的操作,可能有精度問題。

方法三:最優的方法。利用向量叉積。因為a×b=|a|.|b|sinθ。如果共線sinθ為0。

向量叉積後還是的向量,這個向量的長度是兩個向量所組成平行四邊形的面積。如果共線,這個值為0。

**:

class solution 

};

題目:從二叉搜尋樹到更大和樹(binary search tree to greater sum tree)

/problems/binary-search-tree-to-greater-sum-tree/

題意:

修改樹的每個節點的值,為訪問的所有節點的和,包括當前節點。

訪問的次序是先訪問右子樹,再訪問根節點,再訪問左子樹。

思路:

**比較簡單,遞迴實現。

**:

class solution 

};

題目:多邊形三角剖分的最低得分(minimum score triangulation of polygon)

/problems/minimum-score-triangulation-of-polygon/

題意:

想象乙個凸 n 邊多邊形,其頂點按順時針順序依次標記為 a[0], a[i], …, a[n-1]。

假設您將多邊形剖分為 n-2 個三角形。對於每個三角形,該三角形的值是頂點標記的乘積,三角剖分的分數是進行三角剖分後所有 n-2 個三角形的值之和。

返回多邊形進行三角剖分後可以得到的最低分。

思路:選定凸多邊形的一條邊為底(a[0]a[n-1]組成的線段),和a[i]為頂點,可以把凸多邊形分為三部分,左側a[0]a[1]…a[i]組成的凸多邊形,右側a[i]a[i+1]…a[n-1]組成的凸多邊形,還有a[0]a[i]a[n-1]組成的三角形。

兩個凸多邊形還可以再遞迴分解,最後比較出最優解。遞迴算過的形狀不用重複計算,可以用記憶化搜尋,記錄中間結果。

如果凸多邊形只有兩個點,那麼組成不了三角形,可以直接返回權值為0。

遞推公式為:

設w(i,k,j)為i,j,k三個點組成的三角形的權值。

v[i][j]=0(當i+1==j時)

v[i][j]=v[i][k]+v[k][j]+w(i,k,j)

(當i + 1 < j時, i < k < j)

**:

class solution ;

inline int w(int i, int j, int k, vector& a)

int dfs(int i, int j, vector& a)

return memo[i][j];

}int minscoretriangulation(vector& a)

};

leetcode 第135場周賽解題報告

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...