1、前言
最近剛開始做幾道leetcode,發現之前學到的資料結構的不夠用,遇到的都是動態規劃,在思考無果後查閱網上的解決辦法,思考了很久leetcode的演算法題的解決模式。( ps:是我個人的想法記錄,如有錯誤,請大佬指正)
2、問題分析
(1)返回值
(2)問題拆解
返回值:返回值的確定影響了解決問題的演算法結構
問題拆解:
不同問題的模組意味著不同的**塊,分析拆解完成後要分析問題與另一問題是否有關聯:如上圖的子問題1.1和子問題1.2解決步驟相同,且子問題1的解決步驟與其的子問題解決步驟相同。這時考慮遞迴,如果與上一層問題解決的狀態有關,則考慮動態規劃。
上圖只是描繪了一種問題關係的情況,還可以有其他關係,來完善確定使用哪種演算法解決模型
3、題目分析
3.1、返回值
(1)返回值確定為treenode
的情況
特點:一種結構的樹或節點
(2)返回值確定為list
的情況
特點:返回包含多種結構的樹或節點
3.2 問題拆解
求解n節點的不同結構二叉樹
結構特性:
(1)左子樹比父節點小
(2)右子樹比父節點大
(3)由(1)、(2)當父節點確定時,其左子樹和右子樹範圍確定
(5)當左子樹確定數值,同(3)
如下圖:
**有執行順序,先左子樹執行後右子樹,修改圖如下:
由上圖可以看出,當確定某一節點時的處理步驟,其左子樹和右子樹的處理步驟是相同的,他們都需要進而確定數值,給定範圍後,再在範圍裡確定數值,進行巢狀。(上面的是主要步驟,還有次要的省略了)這時我們考慮使用遞迴來解決這種問題的巢狀。
可以寫出上面的大致**,方便後續完善思路
//任取某一確定值作為父節點,則為遍歷
//遞迴時是範圍傳遞,所以為 定義邊界為引數。未定返回值,暫時定為void
public
void
method
(int start,
int end)
}
根據以上初步**,確定返回值的情況
(1)假如上述方法的返回值設為treenode
。那麼上述的遞迴為了是層層巢狀各種結構的可能,最後只返回乙個節點或樹結構,顯然不合理,先去除這種情況
(2)假如上述方法的返回值為list
那麼返回的就是包含多個樹或節點的情況,這種滿足我們的需要。那麼選取list
為上述方法的返回值。
3.3list
作為返回值的問題
(1)上述方法沒有傳入list
為引數,需要自己new 如下
public list
method
(int start,
int end)
return list;
}
(2)以上**後,得先思考for迴圈、leftchild和rightchild返回方法裡傳入的(start,end)範圍邊界問題。for裡面的話自然是從傳入的start到end,即for(int i=start,i<=end;i++),i表示父節點暫定值
leftchild為左子樹範圍,左邊最小自然是start,右邊則為i-1
rightchild為右子樹範圍,右邊最大自然是end,左邊則為i+1
得到**如下:
public list
method
(int start,
int end)
return list;
}
(2)經過上面後遇到新問題,上述的leftchild和rightchild返回的是自底向上的樹(節點),而且我們的結構就是確定父節點,其左右子樹的結構進行組合,作為一種結構。那麼就需要對leftchild和rightchild進行處理。如下
public list
method
(int start,
int end)}}
return list;
}
(3)以上完善**後,發現遞迴缺少邊界條件。會出現start>end的情況。這時是父節點為該層方法裡範圍最小的值。完善**如下:
public list
method
(int start,
int end)
for(
int i=start;i<=end;i++)}
}return list;
}
以上**全部完善。
這個解決過程就是自己理解別人打的前提下去思考過程後得到的想法,有些過程可以提取,思考演算法題本來就得考慮兩個問題,乙個是得到資料的結構,乙個是問題之間的關係,像鍊錶結構就有鍊錶結構的解法,如果不看資料的結構的話,本身就是無解的。解法的篩選就是取決於問題之間的關係。找出問題和結構的前提作為繼續推導的條件,在層層細化問題和結構後就能有所思路和解決辦法。這裡是提供自己以後解決演算法題時提供想法的記錄。如果遇到新的問題會繼續完善這個模型
我的設計思考過程 1
夜已深,我呆坐在凌亂堆著草稿的寫字桌旁邊,和今天鄭州的天氣一樣,我的心裡充滿了大霧。因為我以前也和朋友製作過幾個小的 頁面和功能都很簡單,我對ps dw fw flash等工具也比較熟悉,滿以為很簡單的問題,畢竟是個人的 嘛,也不是多麼複雜的技術,於是11月的時候就開始 的開發工作,那時候一切進行的...
學習SVM過程思考過的問題
1 在低維空間和高維空間中遇到線性可分和不可分的問題應該如何解決?在低維空間中的線性可分問題,可以直接用logistic回歸解,當然也可以用svm 沒有用到核函式或者理解為用了線性核 在低維空間中的線性不可分問題,用svm解,利用核函式將原 低維 空間對映到高維空間,但計算任然在原空間進行,降低了複...
程式即大腦的思考過程
程式即大腦的思考過程 例如 上班這個行為 我們現在住在b點,上班的地點是a點。現在,我們早上起床了,要上班了。搜尋了一下路線,發現可以通過路線c到達公司。那麼,我們的大腦中就形成了乙個資料夾。這就是我們大腦中的圖式,也就是記憶標籤。資料夾的名稱為,上班路線。以後,我們想到上班路線這個事情時,大腦就會...