Leetcode 第137場周賽解題報告

2022-07-14 12:39:21 字數 2952 閱讀 1949

今天的比賽的題目相對來說比較「直白」,不像前幾周都是一些特定的演算法,如果你沒學過不可能想出來。

做了這些周,對leetcode比賽的題目也發現了一些「規律」。一般前兩道題都很「簡單」,只要有想法,直接敲**就能解出來。更多考察的是結果是否正確,速度其次。

後兩道題有些難度,不同場次難度不一樣,也可能和不同人的水平感受不同。但是肯定比前兩道要難。

一般在做後兩道題的時候,只要複雜度是對的,一些細節也不用考慮太多。例如陣列開的空間大小,一些線性的提前剪枝判斷,寫不寫都可以過。最主要的是複雜度是同乙個量級的。

相信leetcode這麼設計是為了「人性化」,讓選手更關注比賽題目核心,能夠在乙個半小時內完成比賽題目。

總之leetcode的比賽還是很人性化,很注重主要考點,不糾結於細節。利用這些特性,可以在比賽中排除一些錯誤想法。

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

比賽的位址 weekly contest 137

題目:

最後一塊石頭的重量(last stone weight)

/problems/last-stone-weight/

題意:

有一堆石頭,每塊石頭的重量都是正整數。

每一回合,從中選出兩塊最重的石頭,然後將它們一起粉碎。假設石頭的重量分別為 x 和 y,且 x <= y。那麼粉碎的可能結果如下:

如果 x == y,那麼兩塊石頭都會被完全粉碎;

如果 x != y,那麼重量為 x 的石頭將會完全粉碎,而重量為 y 的石頭新重量為 y-x。

最後,最多隻會剩下一塊石頭。返回此石頭的重量。如果沒有石頭剩下,就返回 0。

思路:

乙個陣列,每次把最大的兩個數拿出來相減,然後把絕對值放回原陣列。一直重複到最後只剩下乙個元素,輸出即可。

典型的模擬題,按照題目的意思寫即可。可以用堆來實現,每次拿堆頂的兩個最大元素。

由於是第一題,每次都排序一遍,也能通過。不過在日常工程中,還是老老實實用堆來實現吧。

class solution 

while(q.size()>1)

return q.top();

}};

題目:

刪除字串中的所有相鄰重複項(remove all adjacent duplicates in string)

/problems/remove-all-adjacent-duplicates-in-string/

題意:

給出由小寫字母組成的字串 s,重複項刪除操作會選擇兩個相鄰且相同的字母,並刪除它們。

在 s 上反覆執行重複項刪除操作,直到無法繼續刪除。

在完成所有重複項刪除操作後返回最終的字串。答案保證唯一。

思路:

類似於遊戲「愛消除」,相同的兩個字母抵消掉,形成的新字串再接著抵消,直到穩定為止。

用棧來實現,遍歷字串的每個字元。如果棧為空,則插入字元,否則比較字元和棧頂元素,相同則彈出棧頂元素,不同則壓棧。

最後輸出棧內的字串即可。

**:

class solution 

else

else}}

string res;

while(!st.empty())

reverse(res.begin(), res.end());

return res;

}};

題目:

最長字串鏈(longest string chain)

/problems/longest-string-chain/

題意:

給出乙個單詞列表,其中每個單詞都由小寫英文本母組成。

如果我們可以在 word1 的任何地方新增乙個字母使其變成 word2,那麼我們認為 word1 是 word2 的前身。例如,"abc" 是 "abac" 的前身。

詞鏈是單詞 [word_1, word_2, ..., word_k] 組成的序列,k >= 1,其中 word_1 是 word_2 的前身,word_2 是 word_3 的前身,依此類推。

從給定單詞列表 words 中選擇單詞組成詞鏈,返回詞鏈的最長可能長度。

思路:

這道題本質是圖演算法。

分兩步解:

第一步先構造出每個單詞之間的關係,判斷任意兩個單詞是為前身後繼關係。構造完關係就能畫出了圖。

第二步就是求解這個圖中最長路徑。由於是單向有向圖,而且沒有環。

構造乙個集合,每次給集合放入新的點a,都判斷集合中其他的點到該點的距離,取最大值為集合內部到新點a的最大距離l。下次再加入新的點a1,如果a和a1連通,則集合到a1的距離為l+1。

由於終點有多個,最後要遍歷所有點的最長距離。

其實這道題的思想和dijkstra演算法是一樣的。

**:

class solution         }}

return true;

}int longeststrchain(vector& words) ;

int sum = 0;

int n = stones.size();

for(int i=0;idiff[0][stones[0]] = 1;

for(int i=1;i}

}for(int i = 0; i <= sum; ++i)

}return 0;

}};

周賽 第137場 2019 5 19

目錄 1.最後一塊石頭的重量 easy。堆 2.刪除字串中的所有相鄰重複項 easy。棧 3.最長字串鏈 medium。dfs dp 4.最後一塊石頭的重量 ii medium。dp 有一堆石頭,每塊石頭的重量都是正整數。每一回合,從中選出兩塊最重的石頭,然後將它們一起粉碎。假設石頭的重量分別為 x...

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