【LeetCode】Biweekly Contest 10 總結

一、概述

做的很差勁,至少可以拿出半小時看第四題的,結果只ac了第一題和第三題。所以對自己很生氣,要總結一下經驗教訓。

二、分析

1、第一題

輸入三個有序數組,找相同元素。

我是個傻逼,爲什麼這麼說呢?我第一眼看到這題,腦子裏直接就想的是三個指針移動,有一個到末尾就退出。想的挺好,也是這麼實施的。問題就出來了:如何讓三個指針移動呢?這個邏輯怎麼設計?需要想一會,我寫到一半纔開始想這個問題,邊界條件有點多,就着急起來,怎麼寫都報錯。就很蛋疼。

然後靈光一閃,想到可以兩兩比較,先找出前兩個數組的相同元素,保存爲tmp,然後找tmp和第三個數組的相同元素即可。三個指針不好弄,兩個就簡單多了,你比我大我往後,我比你大我往後。就很容易做出回來了。

我這題就想起來卡爾一套二十連結果被bkbPA一刀暴死,弄什麼花裏胡哨的東西啊,做出來就行嘛。

2、第二題

輸入兩個二分搜索樹和一個值,若樹中存在兩個節點,和等於此值,返回true,否則返回false。

我是個大傻逼,爲什麼這麼說呢?我第一眼看到這題,開始想二分搜索樹是什麼。二分搜索樹一定左子樹所有節點小於該節點值,右子樹所有節點大於等於該節點值。成了,我就先讓兩節點相加,然後看大還是小,若是小,那就在看一個節點和另一個節點的左子樹相加大還是小——DFS的思想,一個DFS包辦。但是遇到最差情況:節點有序的二分搜索樹,退化成鏈表了,然後tar又是最大的兩個值相加,那我這時間複雜度爲O(m*n),wdnmd,就一直報TLE。氣死了。我就想,該怎麼剪枝呢?我剪個屁枝,最極端情況根本沒法剪枝,這無法避免,樣例裏有這個我鐵定TLE。這方法從最開始就沒得用。

另外我吐槽一下這個可視化:

這明明是一個正常的二叉樹,根本不是BST。

實際上怎麼做呢?先DFS第一棵樹,保存所有節點值,然後DFS第二棵樹,如果tar-第二棵樹的元素在第一棵樹的節點值集合中,返回true。這就完事了,時間複雜度O(max(m,n))。又簡單又快,把我這花裏胡哨的吊起來打。

3、第三題

輸入上限high和下限low,輸出之間的所有數,這些數滿足如下特徵:相鄰位的數字之差的絕對值爲1,比如說12、89、10101之類。

我是個特大傻逼,爲什麼這麼說呢?第一時間我懵住了,然後開始在紙上畫:1可以衍生出10和12,10衍生101,12衍生121和123,好像是這個規律。看起來像DFS,先1,10,101,1010,10101,直到比high大。DFS個屁,DFS沒法保證有序啊,要有序得用BFS。而且事先做好準備:先把0~9入隊,因爲0可以引出1但是1沒法引出2,1只能引出10和12;沒注意這個我要蛋疼死了。

BFS我又糾結了,low最小是0,high最大兩億呢,這得多少數啊,我最開始可不可以不從0開始啊,從low開始?不行,low不一定滿足要求,low不能入隊。那寫一個函數找到最小的大於low的滿足條件的值?這得怎麼寫啊,看上去很麻煩。寫個屁!首先從算法原理上來講,這就是10棵不同的樹,你準備工作就是生成這10棵樹,你要是low=10000你從10101開始也沒法找齊所有的數,這是其一;其二就是tm極限情況就是low=0high=兩億,你就得一個一個輸出所有的,怕什麼時間爆表,存在這種情況那就證明不能爆表,寫就完事了。

4、第四題

第四題我題都沒看我總結個毛線,但一想就是DP,DP我還沒看,肯定做不出。

三、總結

從第一題裏面,我可以知道大於2的情況若能化爲等於2的情況結合,那麼這種做法一定是最簡單的,也就是結合律要靈活使用:a+b+c=a+(b+c);

從第二題裏面,我可以知道要注意極限情況的討論,注意自己算法在極限情況時的時間複雜度,極限情況一般沒法剪枝,這個時間複雜度要是超了那就沒轍;

從第三題裏面,我可以知道極限情況的最少時間,與第二題相印證,第二題通過極限情況的最小時間複雜度推翻我的算法;第三題通過極限情況的最小時間複雜度支撐我的算法,總而言之,極限情況很重要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章