序列生成;及合併總數分析
今日面試題:序列生成
給定一個表示式2^i*2^j,其中i,j為非負整數。請找到一種方法,生成如下序列:
2^0 * 5^0 = 1
2^1 * 5^0 = 2
2^2 * 5^0 = 4
2^0 * 5^1 = 5
2^3 * 5^0 = 8
2^1 * 5^1 = 10
2^4 * 5^0 = 16
2^2 * 5^1 = 20
2^0 * 5^2 = 25
...
...
...
請大家開動腦筋,找到更多的方法。
=================================================
合併總數分析
原題
求正數陣列內和為指定數字的合併總數
比如[5, 5, 10, 2, 3] 合併值為 15 : 有4種 : (5 + 10, 5 + 10, 5 + 5 + 2 + 3, 10 + 2 + 3)
分析
有的時候,一個題目不能夠立刻想到比較優化的想法,就可以先找到一個解決方案,然後根據方案的不足進行優化。而且這個時候,逆轉一下思路,便會柳暗花明。由遞迴到動態規劃,不就是如此麼?
我們設定f(index,sum)表示陣列從index開始到結束組成的sum的總數。那麼,f(index, sum)可以表示為什麼呢? 我們這個題目,就是要最終求得f(0, 15),從頭開始分析,最終組成的和為15的可能組合中,可能包含第0個元素,也可能不包含, 原始陣列為A:
- 當包含第0個元素時,剩下的表示為f(1, 15-A[0])
- 不包含第0個元素時,剩下的表示為f(1, 15)
則,f(0, 15) = f(1, 15) + f(1, 15 - A[0])。依次遞迴。遞迴的終止條件是什麼呢?對於f(index,sum):
- 當和小於等於0的時候,f(index,sum) = 0
- 當和小於sum的時候, f(index, sum) = f(index + 1, num);
- 當和等於sum的時候,f(index, sum) = 1 + f(index + 1, sum);
但是,上面的條件,並沒有使用題目中,陣列全是正數,也就是存在負數也可以。如果僅僅是正數,後兩個改為:
- 當和小於sum的時候, f(index, sum) = 0;
- 當和等於sum的時候,f(index, sum) = 1;
有一個條件,我們沒有使用,也意味著提升的空間。
可是,上面的方案,時間複雜度是指數級。怎麼做一些改進呢?一般在對一個演算法進行優化的時候,有哪些思路呢?尤其是這種時間很恐怖的?我想很多同學都有這個經驗,就是空間換時間。
大家可以想象動態規劃的思想,大家看如下的狀態轉移方程:
dp[n][m]=dp[n-1][m]+dp[n-1][m-num[n-1]]
dp[n][m]表示前n個元素組成和為m的情況數。初始化dp[0][0]=1,其他為0。寫出狀態轉移方程,大家也就明白了,為何要求全是正數了吧,直白一些,陣列的索引,怎麼可能為負呢?在計算的過程中,將和的情況儲存下來,用空間換時間,整個演算法的時間複雜度為O(n*m),不再是指數級。
【分析完畢】
本文來自微信:待字閨中,2013-08-08釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 合併總數;及相差最大分析
- 找最大數;及序列生成分析
- 最長等差數列;及子序列分析
- 生成表格與合併表格
- 高併發環境下生成序列編碼重複問題分析
- HBase Region合併分析
- matlab 生成隨機數序列Matlab隨機
- P9746 「KDOI-06-S」合併序列
- 洛谷 P10512 序列合併
- TortoiseGIT建立及合併分支Git
- abc324E 合併兩字串後能得到某個子序列的方案數字串
- 子序列;及又見排序分析排序
- 使用 Linux seq 命令生成數字序列Linux
- 藍橋杯-合併數列
- java快速分割及合併檔案Java
- 全球大資料公司融資及併購情況彙總分析大資料
- JS動態生成表格後 合併單元格JS
- Hbase-原理-region合併和hfile的合併(大合併、小合併)
- 樹上啟發式合併總結
- 段合併優化及注意事項優化
- 時間序列分析基本思想及時間序列建模步驟
- 電信聯通合併原因分析 聯通和電信合併是真的嗎?
- 遊戲運營活動效果分析(三):區服合併分析遊戲
- 序列生成函式函式
- Android 合併生成分享圖片(View截圖)AndroidView
- 將labelme生成的label和img合併展示
- Hive表小檔案合併方法總結Hive
- 數學-概率與統計-數理統計-總結(四):方差分析及迴歸分析
- 併發序列呼叫介面
- PHP 圖片的合併,微信小程式碼合併,文字合併PHP微信小程式
- excel相同名稱數量相加彙總 excel相同名稱自動合併求和Excel
- MATLAB生成隨機數總結Matlab隨機
- Excel應用技巧:不規則合併單元格之批量填充序列Excel
- 使用 Java 8 函數語言程式設計生成字母序列Java函數程式設計
- javascript 物件合併程式碼例項簡單分析JavaScript物件
- Qrcode生成二維碼的引數總結 及最小尺寸的測試
- .NET生成小程式碼,併合自定義背景圖生成推廣小程式二維碼
- 影片合併分割軟體如何合併影片