從3月份開始刷leetcode到現在,一共刷了401題。其實在刷了100題左右時,我就萌生了要不要把一些我遇到的問題總結一下的想法。但是,那時候的總結更像些奇淫巧計,而不是真正的「技巧」,或者說不是一種做題的思想。我覺得我的「思想」是還遠遠不夠的,一種穿透現象看清本質的思想。我一開始的解題思路,往往是跟著題目的意思走,他讓我幹嘛我就幹嘛,徘徊在表象周圍,雖說最終能得到答案,但是這樣的演算法很「醜」。演算法的「醜」和「漂亮」是我對比別人的思路和我的思路突顯出來的,這讓我很消沉同時又很興奮,這樣子「漂亮」的演算法是多麼迷人!我很慶幸我能如此飢渴,不斷學習別人的思想,不斷開闊著自己的眼界。我知道現在我所了解的,遠遠小於演算法世界的冰山一角。我很慶幸我能如此無知,這恰恰是我的動力。
我和鳳雛的口頭禪:保持飢渴,保持謙卑。
//對於「()」的問題,都是圍繞是否合法的主題開展的。
//「()」的合法怎麼判斷?
//「()」合法 」)(」不合法 最終能「(」和「)」能成對
//第一種思路:
//第一步:從左到右,「)」要是比「(」的個數多乙個,那肯定是不合法。
//第二步:將序列反轉,從左到右,「(」要是比「)」的個數多乙個,那肯定是不合法。
void
judge
(string s,
char p)
//p為「)」
}reverse
(s.begin()
,s.end()
);if(p==
")")
judge
(s,"(");
}//第二種思路
//利用棧的filo特點,可以模擬「(」和「)」成對出現的情況。
bool
judge
(string s)if(
!st.
empty()
)return
false
;//若棧中還有元素,則原字串不合法
return
true
;}
個人認為如果單看是否合法的話,棧只需只需遍歷一次,相對與第一種思路會效率高些。但是,往往不是判斷是否合法這麼簡單的,需要一定的拓展工作,所以我認為第一種思路的拓展性比第二種要好。 Leetcode刷題之括號
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...
leetcode刷題之堆
今天終於開啟的第二個專題的刷題之旅堆,不過第乙個專題棧還有乙個小問題沒解決就是利用遞減棧去解決接雨水的問題,雖然那道題我用動態規劃的問題解決出來了,我記得看到過一道面試題,問棧和堆有什麼區別。通過搜尋網上的資料總結如下。棧 stack 由系統分配記憶體,速度較快,但是自己無法掌握。堆 一般用兩種方法...
leetcode刷題之樹
樹的三種遍歷方式 的 非遞迴版本 中序遍歷 下面的解法就是相當於 第一趟先把元素按照中序的順序進棧 第二趟 是相當於把 null標記過的位置給拿出來 class solution else return res 先序遍歷 class solution else return res 公共父節點 pu...