今天的比賽的題目相對來說比較「直白」,不像前幾周都是一些特定的演算法,如果你沒學過不可能想出來。
做了這些周,對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...