diff --git a/notes/60. n 个骰子的点数.md b/notes/60. n 个骰子的点数.md index 9da2c1c0..951cb68f 100644 --- a/notes/60. n 个骰子的点数.md +++ b/notes/60. n 个骰子的点数.md @@ -2,7 +2,7 @@ ## 题目链接 -[Lintcode](https://www.lintcode.com/en/problem/dices-sum/) +[Leetcode](https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof/) ## 题目描述 @@ -19,23 +19,23 @@ 空间复杂度:O(N2) ```java -public List> dicesSum(int n) { +public double[] statisticsProbability(int num) { final int face = 6; - final int pointNum = face * n; - long[][] dp = new long[n + 1][pointNum + 1]; + final int pointNum = face * num; + long[][] dp = new long[num + 1][pointNum + 1]; for (int i = 1; i <= face; i++) dp[1][i] = 1; - for (int i = 2; i <= n; i++) + for (int i = 2; i <= num; i++) for (int j = i; j <= pointNum; j++) /* 使用 i 个骰子最小点数为 i */ for (int k = 1; k <= face && k <= j; k++) dp[i][j] += dp[i - 1][j - k]; - final double totalNum = Math.pow(6, n); - List> ret = new ArrayList<>(); - for (int i = n; i <= pointNum; i++) - ret.add(new AbstractMap.SimpleEntry<>(i, dp[n][i] / totalNum)); + final double totalNum = Math.pow(6, num); + double[] ret = new double[pointNum - num + 1]; + for (int i = num; i <= pointNum; i++) + ret[i - num] = dp[num][i] / totalNum; return ret; } @@ -46,16 +46,16 @@ public List> dicesSum(int n) { 空间复杂度:O(N) ```java -public List> dicesSum(int n) { +public double[] statisticsProbability(int num) { final int face = 6; - final int pointNum = face * n; + final int pointNum = face * num; long[][] dp = new long[2][pointNum + 1]; for (int i = 1; i <= face; i++) dp[0][i] = 1; int flag = 1; /* 旋转标记 */ - for (int i = 2; i <= n; i++, flag = 1 - flag) { + for (int i = 2; i <= num; i++, flag = 1 - flag) { for (int j = 0; j <= pointNum; j++) dp[flag][j] = 0; /* 旋转数组清零 */ @@ -64,10 +64,10 @@ public List> dicesSum(int n) { dp[flag][j] += dp[1 - flag][j - k]; } - final double totalNum = Math.pow(6, n); - List> ret = new ArrayList<>(); - for (int i = n; i <= pointNum; i++) - ret.add(new AbstractMap.SimpleEntry<>(i, dp[1 - flag][i] / totalNum)); + final double totalNum = Math.pow(6, num); + double[] ret = new double[pointNum - num + 1]; + for (int i = num; i <= pointNum; i++) + ret[i - num] = dp[1 - flag][i] / totalNum; return ret; }