總結(jié)181到240這六十題medium難度的。這一段做的很不好,好多題都不太會(huì)。這里要好好總結(jié)一下,一天搞不定分兩天,不過一定要每一題都能過。數(shù)了一下,六十題有二十九道題不會(huì)做,我也是醉了。剩下還有六十題這樣子,要踏實(shí)得慢慢過,不要著急。每一道題都有它出彩的地方,這些點(diǎn)要理解清楚,之后再去做難題會(huì)好很多。
361. Bomb Enemy: 這題最主要的思想就是,先提前用循環(huán)更新當(dāng)前的row enemy和col enemy。但是并不是對(duì)每一個(gè)值都更新,只有初始化的時(shí)候,還有就是碰到墻壁要重置的時(shí)候才去更新值,其它的時(shí)候就直接用前面更新過的值。
365. Water and Jug Problem: 主要就是要證明一個(gè),如果x,y是coprime的話,那么可以獲得[0, x+y]中的任何值。如果不是coprime,那么就是可以獲得 gcd(x, y)*[0, x+y]中的任何值。證明過程https://leetcode.com/problems/water-and-jug-problem/discuss/ 。而要計(jì)算coprime x y的話,就是用遞歸 gcd(a, 0) = a, gcd(a,b) = gcd(b, a%b)
372. Super Pow: 這道題踩的人很多,基本的想法就是(a*b)%c = a%c*b%c所以a^[1,2,3]%c = a^[1,2]^10%c*a^3%c 而對(duì)于a^x%c = for i in range(c): res= (res*a)%c
375. Guess Number Higher or Lower II: minmax,每一個(gè)子情況都考慮最壞的,不過對(duì)于所有的子情況中,獲取一個(gè)最好的。還有這題又是一道對(duì)角線dp,對(duì)于對(duì)角線dp進(jìn)行循環(huán)的時(shí)候,可以去循環(huán)一個(gè)distance表示i,j之間的距離,然后再循環(huán)i,計(jì)算出j = i+distance,這樣可以保證從先計(jì)算出靠近對(duì)角線的值再計(jì)算遠(yuǎn)離對(duì)角線的值。
382. Linked List Random Node: 蓄水池采樣法
384. Shuffle an Array: 這題應(yīng)該會(huì)做的。只是簡(jiǎn)單的利用random.randint,然后不停的從數(shù)組中移除元素。
385. Mini Parser:利用stack,但是最關(guān)鍵的問題是每碰到一個(gè)【就創(chuàng)建一個(gè)object 加入到stack里,每碰到一個(gè)】就把當(dāng)前的object加入到stack[-1]里。然后再分別考慮“,”和number的情況。
386. Lexicographical Numbers:這道題很難想。記錄一下邏輯思路,希望下一次能直接寫出來:先對(duì)當(dāng)前res里的最后一個(gè)元素乘以10賦值為cur,如果cur大于n說明,乘以10超過了n的范疇,然后就把cur再除以10,并且加1,比如說最后一個(gè)值是2,那么先變化為20,如果20太大了,就變回2并且加1,變到3.如果是100就先變到1000,然后如果1000太大了,就變回100,并且加1把101放入到res里去。不過此時(shí)要處理一種情況,比如說當(dāng)前是199,先放大十倍,如果1990不在范圍然后變回199并且加1,就是200,這時(shí)候要檢測(cè)200%10是否是0,如果是的話,就變回到20,再檢測(cè)20%10,還是為0,就繼續(xù)變回到2。然后再繼續(xù)。
388. Longest Absolute File Path:首先要想到要按\n split整個(gè)input,然后要記錄個(gè)元素的level,這個(gè)level可以有前綴\t 的個(gè)數(shù)來確定。然后每次訪問要從當(dāng)前l(fā)evel - 1,也就是父文件夾開始。
390. Elimination Game: 這題解法也挺奇特,要記錄變量是head的位置,當(dāng)前步長(zhǎng)還有剩余數(shù)的個(gè)數(shù)
393. UTF-8 Validation:python的二進(jìn)制表示法:0b11110000. 知道這個(gè)之后,記錄一個(gè)當(dāng)前的i,然后一個(gè)一個(gè)loop就可以了
395. Longest Substring with At Least K Repeating Characters: 這題是用recursion的思想來做,不停的分成substring,然后再計(jì)算substring的可能性。
396. Rotate Function:利用相鄰的差的公式,循環(huán)計(jì)算就可以了。
397. Integer Replacement: 主要要觀察到一個(gè)性質(zhì),n%4==3的時(shí)候要+1,==1的時(shí)候要-1。
399. Evaluate Division:這題是創(chuàng)建一個(gè)帶權(quán)重的圖,然后在圖里面找最短路徑。
413. Arithmetic Slices: 利用前向型指針,先計(jì)算出所有等距線段的長(zhǎng)度,然后再通過一次數(shù)學(xué)計(jì)算就可以了。
416. Partition Equal Subset Sum: 比較非典型的一個(gè)背包問題,其實(shí)能想到這是一道背包問題基本上這題就算是做出來了。
418. Sentence Screen Fitting: 這道題大概的解法是知道了,不過為什么還不是很清楚
421. Maximum XOR of Two Numbers in an Array: 首先要記得一個(gè)性質(zhì) a^b=c => a^c=b,然后記錄當(dāng)前的prefix和下一個(gè)可能的next_prefix = prefix << 1 | 1如果next_prefix = a^b的話,就更新。
423. Reconstruct Original Digits from English: 還算是有意思的一種解題思路,直接靠眼觀察的
439. Ternary Expression Parser: 還算比較容易的一道題,應(yīng)該是當(dāng)時(shí)已經(jīng)做昏頭了,所以才沒做出來吧。在用stack存儲(chǔ)的時(shí)候,可以用一個(gè)op來記錄當(dāng)前的operator。
444. Sequence Reconstruction: 一道topologysort的問題,雖然拓?fù)渑判虮容^簡(jiǎn)單,但是要把題目識(shí)別出來時(shí)拓?fù)渑判蜻€是需要一定的功力的。
450. Delete Node in a BST: 利用遞歸的思想,比較當(dāng)前的root和key的大小直到找到root.val==key,然后再對(duì)這個(gè)root進(jìn)行替換
456. 132 Pattern:用stack維護(hù)一個(gè)遞減區(qū)間,這種題目說難很難,知道解法后代碼量不多,感覺還好。
464. Can I Win: 這道題想起來也不是很難。不過這種play game的題目一向是我的弱項(xiàng)。
467. Unique Substrings in Wraparound String: 關(guān)鍵的一個(gè)觀察點(diǎn)在于以某個(gè)一char結(jié)尾的所有substring等于以這個(gè)char結(jié)尾的最長(zhǎng)substring的長(zhǎng)度。比如說zabcd,如果找所有以c結(jié)尾的substring 就等于 4 == len(zabc) == len([zabc, abc, bc, c])
469. Convex Polygon: 這題是真心不會(huì)做。。。只能強(qiáng)行背答案。。?;镜南敕ㄊ莄rossproduct可以求出兩個(gè)vector的方向(順時(shí)針還是逆時(shí)針),然后所有的這樣的點(diǎn)和邊都要保持這樣的方向就可以了。
473. Matchsticks to Square: 又是一種backtracking的新思路。把pos走到底看看有沒有形成最終答案。
474. Ones and Zeroes: 這題是特別典型的背包dp,要多練習(xí)啊。