【LEETCODE】76、面試題 08.11. 硬幣

package dynamicprogramming.medium;

/**
 * @Auther: xiaof
 * @Date: 2020/4/23 09:17
 * @Description:面試題 08.11. 硬幣
 * 硬幣。給定數量不限的硬幣,幣值爲25分、10分、5分和1分,編寫代碼計算n分有幾種表示法。(結果可能會很大,你需要將結果模上1000000007)
 *
 * 示例1:
 *  輸入: n = 5
 *  輸出:2
 *  解釋: 有兩種方式可以湊成總金額:
 * 5=5
 * 5=1+1+1+1+1
 * 示例2:
 *  輸入: n = 10
 *  輸出:4
 *  解釋: 有四種方式可以湊成總金額:
 * 10=10
 * 10=5+5
 * 10=5+1+1+1+1+1
 * 10=1+1+1+1+1+1+1+1+1+1
 * 說明:
 * 注意:
 * 你可以假設:
 * 0 <= n (總金額) <= 1000000
 *
 * 來源:力扣(LeetCode)
 * 鏈接:https://leetcode-cn.com/problems/coin-lcci
 * 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
 */
public class WaysToChange {

    /**
     *
     * 功能描述: 
     *執行用時 : 46 ms , 在所有 Java 提交中擊敗了 34.42% 的用戶
     * 內存消耗 : 43.8 MB , 在所有 Java 提交中擊敗了 100.00% 的用戶
     * @author: xiaof
     * @date: 2020/4/23 9:41
     * @Description: 
     */
    public int solution(int n) {
        //動態規劃,f(n)=f(n-{1,5,10,25}) + x,
        int[] res = new int[n + 1], money = new int[]{1,5,10,25};
        res[0] = 0; res[1] = 1;
        for (int j : money) {
            for (int i = 2; i <= n; ++i) {
                if (i > j) {
                    res[i] = (res[i] + res[i - j]) % 1000000007;
                } else if (i == j) {
                    res[i] += 1;
                }
            }
        }

        return res[n];
    }

    public static void main(String[] args) {
        WaysToChange fuc = new WaysToChange();

        int n1 = 10;
        int n2 = 900750;

        fuc.solution(n2);
    }
}

少見的能自己做出來的leetcode中等難度的題。。。。加油,奧利給

 

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