Leetcode5 手寫快速排序、合并區(qū)間、重建數(shù)字、字符串排列
放寒假了這幾天,然后回家啥的,有一兩天沒有寫Leetcode hh

手寫快排
手寫快速排序這道題是找出數(shù)組中的第K個最大的數(shù)字中的,但是因為這道題沒有別的多余的技巧,所以主要復(fù)習(xí)一下手寫快速排序。
手寫快速排序主要分成兩個部分。第一個部分是將當(dāng)前由start和end確定的數(shù)組分成兩個部分,通過pivot元素隔開,左邊的部分的所有元素小于pivot,右邊的部分的所有元素大于pivot。然后在分別處理左右兩邊:
同時,還有另外一種排序就是歸并排序。對于歸并排序,先調(diào)用遞歸的當(dāng)時將數(shù)組分解成一個一個的元素(組成的小數(shù)組),然后根據(jù)大小進行合并。在合并的過程中需要使用額外數(shù)組:

合并區(qū)間

這道題思路比較簡單純粹。首先我們將數(shù)組看做一個二元組,根據(jù)每個二元組的第一項進行排序。然后遍歷數(shù)組,對于當(dāng)前的二元組i,他的前一項i-1的第二項小于i的第一項,說明二者存在交集,然后比較i和i-1的第二項,取最大的結(jié)果,合并兩項為一項。存到最后的結(jié)果ans中。每次取出ans和后面的進行對比:

從英文中重建數(shù)字

我個人覺得這道題非常無聊。我第一次實現(xiàn)的時候使用的是hash的方式,記錄數(shù)字0-9的英文的字母出現(xiàn)的次數(shù),然后使用s嘗試減去,這種方式超時了。所以,最后只能使用官方題解的方法,使用特殊元素的方式,比如只有0中包含了z字母,進行推測:

字符串的排列

對于這道題,因為需要比較s1的某種排列在s2中是否會出現(xiàn),很顯然的一條思路是因為在排列前后的字符串的元素組成不會改變,那么,可以通過滑動窗口的方式,比較當(dāng)前的串s1和s2長度為s1.length()的子串的元素是否相同。 具體的操作是通過第一次遍歷,我們可以得出s1的所有字符的hash,后續(xù)每次移動一個字符,進來的字符數(shù)量++,出去的字符數(shù)量--。