安卓現(xiàn)在可卷了,現(xiàn)在招聘都是人均造火箭水平献联,雖然進(jìn)去還是擰螺絲竖配。以前大部分公司不做算法也ok,現(xiàn)在稍微有點規(guī)模的公司里逆,甚至初創(chuàng)公司都是算法考的飛起进胯。
為啥?大概是疫情干倒了好多互聯(lián)網(wǎng)公司原押,甚至大廠也流出了很多大佬在市場上跟你搶飯碗胁镐,然后大佬在空降小廠坐鎮(zhèn)tl甚至總監(jiān),算法成必卷項了诸衔,怎么搞盯漂,刷刷唄。
BUT笨农,刷算法的鐵汁就缆,有沒有這樣的體驗?上個月刷的題谒亦,上周刷的題竭宰,甚至昨天刷的題轉(zhuǎn)眼就忘了空郊。
最近幾個月我也在刷算法題,已經(jīng)刷了快100題了切揭。在工作的同時學(xué)習(xí)刷算法狞甚,個人感覺這個效率還可以。不過也走了一些彎路廓旬,所以把自己的心得分享一下哼审,大致思路就是:
1.由簡向繁
首先如果是新手,刷算法肯定會遇到難題嗤谚,會被各種阻塞,很容易搞心態(tài)怔蚌,從入門到放棄巩步,但是本質(zhì)上也不是你不夠聰明,大概率是因為你沒有一個方法論桦踊,加上熟能生巧椅野。
所以正確的初入刷題姿勢應(yīng)該是
打開leetcode.com網(wǎng)站 >> 打開題庫 >> 點擊通過率
通過率
通過率這么高,一般題目也容易做籍胯,這樣才不容易從入門到放棄 - ->股痢!
2杖狼、分類刷題
其實刷題容易忘炼蛤,除了有題目難,解法復(fù)雜的因素之外蝶涩,還有一個因素是理朋,沒有形成體系。
分類刷題就是為了解決這個問題的绿聘。首先從一類題入手這里推薦網(wǎng)站labuladong嗽上,里面除了對題目進(jìn)行典型分類梳理,還有很詳細(xì)的解題思路描述熄攘。
同樣的分類刷題依舊是采用由簡到繁的原則兽愤,舉個例子。
labuladong頁面一開始的鏈表題
鏈表題
如果你全部做完挪圾,你會發(fā)現(xiàn)其實困難題浅萧,大部分是由簡單題解法的混合操作,也就是簡單題的發(fā)散了哲思,所以不要瞧不起簡單題惯殊,它是你成功的基石。
比如合并K個鏈表也殖,一般效率最高的方式就是采用分治土思,分治的意思就是分而治之务热,把原來基數(shù)比較大的問題分割成小的問題,一直分割到最小兩個元素的處理己儒,最后問題就轉(zhuǎn)換成了21題的合并兩個有序鏈表的方法崎岂。
ABCDEFGHM -> ABCD EFGHM
-> AB CD EF GH M 然后AB合并成了新的鏈表L CD為N 繼續(xù)合并L和N如此往復(fù),
最后困難題就被拆解成簡單題了闪湾。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode top = new ListNode();
ListNode index = top;
while(list1 != null && list2 != null){
if(list1.val > list2.val) {
index.next = list2;
list2 = list2.next;
}else{
index.next = list1;
list1 = list1.next;
}
index = index.next;
}
index.next = list1 != null ? list1 : list2;
return top.next;
}
再比如876找到鏈表的中間位置
public ListNode middleNode(ListNode head) {
ListNode f = head;
ListNode s = head;
while(f.next != null && f.next.next != null){
f = f.next.next;
s = s.next;
}
return f.next != null ? s.next : s;
}
那么我們就可以利用這個題目配合遞歸的深度逆向特性解決掉一些需要逆轉(zhuǎn)鏈表頭尾節(jié)點的題目冲甘。
在連續(xù)一段時間內(nèi)持續(xù)的對一種方法進(jìn)行正向刺激,達(dá)到強化記憶的效果途样。
然后在整體刷完一大類題之后江醇,再重新回來看這里的題目,重新加深記憶何暇。