程序員進階之算法練習(xí)(十六)

前言

正文6道題目來自leetcode––為求職為生的編程網(wǎng)站森渐,目的是工作閑暇之時錘煉代碼功底劳曹。
沒有捷徑妓灌,但手熟爾;
一步領(lǐng)先晨汹,步步領(lǐng)先。

正文

5. Longest Palindromic Substring
題目鏈接
題目大意:
輸入一個回文串贷盲,輸出長度最長的回文子串淘这;
如果有多個答案,輸出任意一個巩剖。

Example
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

** 題目解析:**
模板題铝穷,有現(xiàn)成的解法。
求回文串有O(N)的算法佳魔,詳見manacher解析曙聂。
** 復(fù)雜度解析:**
空間、時間復(fù)雜度都是O(N)鞠鲜, N是字符串的長度宁脊;
** 其他解法:**
暴力,從每個點開始枚舉贤姆,判斷最長的回文子串榆苞,O(N^2);
kmp,回文串s和s的轉(zhuǎn)置是一樣的霞捡,那么可以把原串s和s'進行匹配语稠,判斷區(qū)間是否合法;(有可能存在匹配弄砍,但是區(qū)間不重疊的情況)

30. Substring with Concatenation of All Words
題目鏈接
***題目大意: ***
給出一個字符串s仙畦,一個字符列表words,words內(nèi)的單詞都是同一長度音婶,找到一個區(qū)間慨畸,要求:
1、區(qū)間內(nèi)的字符串衣式,可以切分成若干個連續(xù)的子串寸士,每個子串都是words的單詞檐什;
2、每個單詞只出現(xiàn)一次弱卡;
輸出所有可能的區(qū)間的起點乃正。

For example, given:
s: "barfoothefoobarman"
words: ["foo", "bar"]
You should return the indices: [0,9].

題目解析:
題目提供了一個了一個不可忽視的限制,所有的words是同一長度婶博,這樣就避免了fool和foo的情況瓮具;
并且在判斷s的子串是否出現(xiàn)時,可以直接截取長度為m的字符串凡人。
這樣流程就變成:
1名党、初始位置s,截取m個字符str挠轴,查詢str是否在words中传睹,如果在則判斷下m個字符;
2岸晦、如果不在words中欧啤,則回溯到最初的位置s,從s+1開始判斷启上。

但是邢隧, 這樣的復(fù)雜度會很高,因為回溯之后又要從原來的位置的下一個開始匹配碧绞。
有一種優(yōu)化方案:假設(shè)len為words字符串的統(tǒng)一長度府框;
從0,1,2...到len-1,分別匹配一次即可讥邻。
這樣可以采取一種策略迫靖,當(l, r)的字符串最后len個字符匹配失敗后,直接從r+1的位置匹配兴使;因為(r-len,r)的字符不存在words中系宜;
如果(r-len, r)在之前已經(jīng)在k出現(xiàn)過,則可以把左邊界移到k+1发魄,直到遇到右邊界盹牧;
可以在len次枚舉后得到結(jié)果。

** 復(fù)雜度解析: **
時間復(fù)雜度是O(N*len)励幼,len為words中單詞的長度汰寓。
空間復(fù)雜度是O(M*len),hash的空間復(fù)雜度較高苹粟;

** 其他解法:**
有稍微慢一點有滑,但是代碼量很小的做法。
僅需20行嵌削。
詳見這里

56. Merge Intervals
題目鏈接
** 題目大意:**
給出n個數(shù)字區(qū)間毛好,把有相交的區(qū)間合并起來望艺。

example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

題目解析:
區(qū)間合并只需考慮最左和最右的邊界。
先排序肌访,把可能合并到區(qū)間集合在一起找默。
容易知道如果前面區(qū)間的right >= 當前區(qū)間的left 的時候,是可以合并的吼驶。
那么遍歷一遍惩激,判斷邊界是否相交即可。

** 復(fù)雜度解析:**
時間復(fù)雜度是O(NlogN)旨剥,N是區(qū)間個數(shù)(時間都在排序上)咧欣;
空間復(fù)雜度是O(N)浅缸,有可能返回N個結(jié)果轨帜。

** 代碼量:**
比較函數(shù)有簡單寫法。
sort(ins.begin(), ins.end(), [](Interval a, Interval b){return a.start < b.start;});

76. Minimum Window Substring
題目鏈接
** 題目大意:**
給出兩個字符串S和T衩椒,在S中尋找一個子串s蚌父,要求:
1、s包括T出現(xiàn)過的所有字符毛萌;
2苟弛、s的字符串長度最小阁将;

For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC".

如果沒有膏秫,返回空串;
題目保證只有一個答案做盅。

** 題目解析:**
題目要求s出現(xiàn)T中所有的字符缤削,但是沒有順序要求,那么對于一段字符串:
字符串的位置是無意義的吹榴。
假設(shè)已經(jīng)選擇一段字符串str亭敢,再選新的一個字符c;
如果字符c沒有出現(xiàn)過图筹,那么c應(yīng)該并入str中帅刀;
如果字符c已經(jīng)出現(xiàn)過,那么新出現(xiàn)的c比原來的c更優(yōu)远剩;
在匹配過程中扣溺,當出現(xiàn)所有T的字符之后,一直保存最小的字符串長度瓜晤。

這里可以用反證法來證明锥余。

假設(shè)按照這一規(guī)則,選出包括所有T字符的子串s=(l, r)活鹰,最右邊的字符是c;
如果在(l, r)的位置k,k∈(l, r)哈恰,存在字符c只估,并且(l, k)出現(xiàn)過所有T的字符;
那么按照之前的過程(l, k)會是最小值着绷。

** 復(fù)雜度解析:**
時間復(fù)雜度是O(N)蛔钙,N是字符S的長度;
空間復(fù)雜度是O(M)荠医,M是T的長度吁脱;

**實現(xiàn)過程: **
收獲一枚WA,沒想到題目還有這種數(shù)據(jù):

Input:
"a"
"aa"
Output:
"a"
Expected:
""

改改即可彬向,記錄下每個字符的數(shù)量兼贡。

123. Best Time to Buy and Sell Stock III
題目鏈接
題目大意:
給出n個數(shù)字的數(shù)組a,a[i]表示第i天股票的價格娃胆;
現(xiàn)在要求進行最多兩次買賣:
1遍希、不考慮購買數(shù)量,利潤就是價格差里烦,要求買賣后利潤最大凿蒜;
2、手上不能同時持有兩次股票胁黑;
3废封、買賣次數(shù)最多為兩次,可以為1次丧蘸。

舉例:
[1,2,3,4] 利潤最大是2;(只有一個選擇1買漂洋、2賣、3買力喷、4賣)
不能買1刽漂、2,在3冗懦、4賣爽冕。

** 題目解析:**
題目要求交易兩次,但是兩次又不能重疊披蕉。
那么可以枚舉k颈畸,[1, k]為第一次交易,[k+1, n]為第二次交易没讲,即可解決兩次交易問題眯娱。
問題簡化成在[1, k]中交易一次,求出最值爬凑。
[1, k] 同樣可以簡化為[1, t]區(qū)間買徙缴,[t+1, k]區(qū)間賣。
但是,這樣的時間復(fù)雜度是O(N^2)于样,因為需要枚舉兩次區(qū)間分隔疏叨。
實際上,這里面有很多重復(fù)的操作穿剖,比如說枚舉完k之后蚤蔓,在枚舉k+1的時候,有[1, k]區(qū)間的運算是之前求過的糊余。
那么秀又,考慮預(yù)處理,把這些結(jié)果存下來贬芥。

leftMax[i] 表示從左邊開始吐辙,前i個的交易的最優(yōu)解;
rightMax[i] 表示從右邊開始蘸劈,前i個的交易的最優(yōu)解昏苏;
這樣只需要枚舉k即可。
時間昵时、空間復(fù)雜度O(n)捷雕;

其他解法:
動態(tài)規(guī)劃椒丧。
因為狀態(tài)數(shù)非常少壹甥,直接用4個狀態(tài)來表示當前狀態(tài)。
// 0: 1 buy, 1: one buy/sell, 2: 2 buys/1 sell, 3, 2 buys/sells

139. Word Break
題目鏈接
** 題目大意:**
給出原串s壶熏,字符串數(shù)組dict句柠,要求:
1、把s分成多個連續(xù)的子串棒假;
2溯职、每個子串都在dict里面;
問帽哑,是否有解谜酒。

s = "leetcode",
dict = ["leet", "code"].
Return true because "leetcode" can be segmented as "leet code".

題目解析:
把一個串分成2個串的可能性有n種可能,n是字符串長度妻枕。
那么對于串[l, r] 如果[l, k] 和 [k+1, r]是合法的僻族,那么[l, r]也是合法的。
故而用動態(tài)規(guī)劃:
dp[i][j] 表示字符串[i, j]是否為合法的子串屡谐;
枚舉k∈[i, j] 來判斷分割字符串的位置述么;
轉(zhuǎn)移轉(zhuǎn)移是O(N),因為需要判斷區(qū)間[i, k]和[k+1, j]是否合法(用字典數(shù)配合)愕掏;
最后判斷dp[1, n]是否合法度秘。

復(fù)雜度解析:
時間復(fù)雜度是O(N^3), N^2的狀態(tài) * N的字典數(shù)判斷饵撑。
空間復(fù)雜度是O(N2+M)剑梳,N2是狀態(tài)數(shù)量唆貌,M是字典數(shù);

優(yōu)化方案:
1垢乙、dp用1維表示挠锥;dp[i] 表示前i個是否合理,轉(zhuǎn)移的時候dp[i]=dp[k] && substr(k+1, i)侨赡;
2蓖租、判斷substr是否存在時,可以用字典樹羊壹。

總結(jié)

給自己定了一個小目標:按照ACrate排序蓖宦,把第一頁所有的題目刷完。
目前已完成20題油猫,第一頁共有50道題稠茂,任務(wù)艱巨。
按照每日一題的時間來算情妖,大概還要一個月的時間才能做完睬关。
剛好,是年后毡证。

一步領(lǐng)先电爹,步步領(lǐng)先?
都知道操作系統(tǒng)料睛、編譯原理丐箩、網(wǎng)絡(luò)原理、數(shù)據(jù)結(jié)構(gòu)重要恤煞,但是現(xiàn)在已經(jīng)沒有毅力再去重新學(xué)一遍屎勘。
忙著面對生活與工作,偶爾的休閑時間則貢獻給娛樂居扒。
這就是普通的生活概漱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喜喂,隨后出現(xiàn)的幾起案子瓤摧,更是在濱河造成了極大的恐慌,老刑警劉巖夜惭,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姻灶,死亡現(xiàn)場離奇詭異,居然都是意外死亡诈茧,警方通過查閱死者的電腦和手機产喉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曾沈,你說我怎么就攤上這事这嚣。” “怎么了塞俱?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵姐帚,是天一觀的道長。 經(jīng)常有香客問我障涯,道長罐旗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任唯蝶,我火速辦了婚禮九秀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粘我。我一直安慰自己鼓蜒,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布征字。 她就那樣靜靜地躺著都弹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匙姜。 梳的紋絲不亂的頭發(fā)上畅厢,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音搁料,去河邊找鬼或详。 笑死,一個胖子當著我的面吹牛郭计,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椒振,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼昭伸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了澎迎?” 一聲冷哼從身側(cè)響起庐杨,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夹供,沒想到半個月后灵份,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡哮洽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年填渠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡氛什,死狀恐怖莺葫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枪眉,我是刑警寧澤捺檬,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贸铜,受9級特大地震影響堡纬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒿秦,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一隐轩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渤早,春花似錦职车、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骂蓖,卻和暖如春积瞒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背登下。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工茫孔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人被芳。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓缰贝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親畔濒。 傳聞我的和親對象是個殘疾皇子剩晴,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容