安卓現(xiàn)在可卷了,現(xiàn)在招聘都是人均造火箭水平,雖然進(jìn)去還是擰螺絲。以前大部分公司不做算法也ok,現(xiàn)在稍微有點(diǎn)規(guī)模的公司,甚至初創(chuàng)公司都是算法考的飛起。
為啥?大概是疫情干倒了好多互聯(lián)網(wǎng)公司,甚至大廠也流出了很多大佬在市場上跟你搶飯碗,然后大佬在空降小廠坐鎮(zhèn)tl甚至總監(jiān),算法成必卷項(xiàng)了,怎么搞,刷刷唄。
BUT,刷算法的鐵汁,有沒有這樣的體驗(yàn)?上個(gè)月刷的題,上周刷的題,甚至昨天刷的題轉(zhuǎn)眼就忘了。
最近幾個(gè)月我也在刷算法題,已經(jīng)刷了快100題了。在工作的同時(shí)學(xué)習(xí)刷算法,個(gè)人感覺這個(gè)效率還可以。不過也走了一些彎路,所以把自己的心得分享一下,大致思路就是:
1.由簡向繁
首先如果是新手,刷算法肯定會(huì)遇到難題,會(huì)被各種阻塞,很容易搞心態(tài),從入門到放棄,但是本質(zhì)上也不是你不夠聰明,大概率是因?yàn)槟銢]有一個(gè)方法論,加上熟能生巧。
所以正確的初入刷題姿勢應(yīng)該是
打開leetcode.com網(wǎng)站 >> 打開題庫 >> 點(diǎn)擊通過率
通過率
通過率這么高,一般題目也容易做,這樣才不容易從入門到放棄 - -??!
2、分類刷題
其實(shí)刷題容易忘,除了有題目難,解法復(fù)雜的因素之外,還有一個(gè)因素是,沒有形成體系。
分類刷題就是為了解決這個(gè)問題的。首先從一類題入手這里推薦網(wǎng)站labuladong,里面除了對題目進(jìn)行典型分類梳理,還有很詳細(xì)的解題思路描述。
同樣的分類刷題依舊是采用由簡到繁的原則,舉個(gè)例子。
labuladong頁面一開始的鏈表題
鏈表題
如果你全部做完,你會(huì)發(fā)現(xiàn)其實(shí)困難題,大部分是由簡單題解法的混合操作,也就是簡單題的發(fā)散了,所以不要瞧不起簡單題,它是你成功的基石。
比如合并K個(gè)鏈表,一般效率最高的方式就是采用分治,分治的意思就是分而治之,把原來基數(shù)比較大的問題分割成小的問題,一直分割到最小兩個(gè)元素的處理,最后問題就轉(zhuǎn)換成了21題的合并兩個(gè)有序鏈表的方法。
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;
}
那么我們就可以利用這個(gè)題目配合遞歸的深度逆向特性解決掉一些需要逆轉(zhuǎn)鏈表頭尾節(jié)點(diǎn)的題目。
在連續(xù)一段時(shí)間內(nèi)持續(xù)的對一種方法進(jìn)行正向刺激,達(dá)到強(qiáng)化記憶的效果。
然后在整體刷完一大類題之后,再重新回來看這里的題目,重新加深記憶。

