由演算法優化引發的思考 路漫漫而修遠

2021-10-02 02:58:23 字數 1027 閱讀 7712

leetcode 32 最長有效括號,這道題我很早就使用暴力破解的解法做過,但是超出時間限制。由於對動態規劃演算法有了進一步的認識,所以又重新以動態規劃的思路來求解。但當我看到官方題解中其他的解法後,感覺自己的智商受到了碾壓,官方題解的解法三和解法四(大家有興趣可以去看一下)都給了我耳目一新的感覺。

一葉而可知秋,對於任何演算法或者其他具體問題,都可以通過不斷的改進而找到更好的解決方案。這道題讓我想到了斐波那契數列的求解的不斷優化,我最初的解法是直接使用遞迴求解,**如下:

public int fibonacci(int n) 

if(n == 1)

return fibonacci(n - 1) + fibonacci(n - 2);

}

但是直接使用遞迴求解,會重複計算一些子問題,例如,f(4)會計算f(3)和f(2),而f(3)會計算f(2)和f(1),這樣f(2)就被重複計算了一次

因此,可以使用動態規劃將原問題的多個子問題的解存起來,這樣就避免了重複計算,**如下:

public int fibonacci2(int n) 

int dp = new int[n + 1];

dp[0] = 1;

for(int i = 2; i <= n; i++)

return dp[n];

}

動態規劃的時間複雜度很好,但是空間複雜度還是 o(n),因此可以對空間複雜度進行優化,**如下:

public int fibonacci3(int n) 

int first = 0;

int second = 1;

int result = 0;

for(int i = 2; i <= n; i++)

return result;

}

從這些演算法題的不斷優化的過程中,我體會到了什麼叫沒有最好,只有更好。希望自己以後可以像那些大牛一樣,對任何問題都能做出最優的解答。路漫漫而修遠啊!

由 引發的思考

前陣子在乙個移動專案中,通過 的方式 繫結click 事件來提交乙個表單,由於表單資訊比較敏感,於是採用的post 同步提交的方式,原本到也沒有什麼。後來萬惡的pm說 你這個按鈕呀,要固定在底部比較好 於是乎就通過 position fixed 固定到底部了。那麼,問題來了 在ios 下,虛擬鍵盤是...

由XML Literal引發的思考

首先,什麼是xml literal呢?原來,這是在vb.net 9.0才引入的乙個用於構建xml物件的新特性,並且只有vb.net 9.0才支援。我們都知道,要建立xml樹,可以使用linq中的api,如下所示 出自vb.net 9.0 xml literal dim xml2 new xeleme...

由html,body引發的思考

預設情況下,html body 除ie6 是沒有高度,但body有margin 在上圖中ie8,ie9,chrome,ff一樣 當僅僅給body設定height 100 時 html未設定height 沒有什麼改變,除了ie6,因為ie6中html預設100 當給html,body都設定height...