From 6c8db5fb8ad70829f3cc635026686cf050aaf937 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 1 Mar 2018 12:49:01 +0800 Subject: [PATCH] auto commit --- notes/剑指 offer 题解.md | 60 ++++++++++++++++++++++++++++++++++++++++ notes/算法.md | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 22ad72b3..10feafc4 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -69,6 +69,7 @@ * [58.1 翻转单词顺序列](#581-翻转单词顺序列) * [58.2 左旋转字符串](#582-左旋转字符串) * [59. 滑动窗口的最大值](#59-滑动窗口的最大值) +* [60. n 个骰子的点数](#60-n-个骰子的点数) * [61. 扑克牌顺子](#61-扑克牌顺子) * [62. 圆圈中最后剩下的数](#62-圆圈中最后剩下的数) * [63. 股票的最大利润](#63-股票的最大利润) @@ -1764,6 +1765,65 @@ public ArrayList maxInWindows(int[] num, int size) { } ``` +# 60. n 个骰子的点数 + +**题目描述** + +把 n 个骰子仍在地上,求点数和为 s 的概率。 + +最直观的动态规划解法,O(n2) 的空间复杂度。 + +```java +private static int face = 6; + +public double countProbability(int n, int s) { + if (n < 1 || s < n) return 0.0; + int pointNum = face * n; + int[][] dp = new int[n][pointNum]; + for (int i = 0; i < face; i++) { + dp[0][i] = 1; + } + for (int i = 1; i < n; i++) { + for (int j = i; j < pointNum; j++) { // 使用 i 个骰子最小点数为 i + for (int k = 1; k <= face; k++) { + if (j - k < 0) continue; + dp[i][j] += dp[i - 1][j - k]; + } + } + } + + int totalNum = (int) Math.pow(6, n); + return (double)dp[n - 1][s - 1] / totalNum; +} +``` + +使用旋转数组将空间复杂度降低为 O(n) + +```java +private static int face = 6; + +public double countProbability(int n, int s) { + if (n < 1 || s < n) return 0.0; + int pointNum = face * n; + int[][] dp = new int[2][pointNum]; + for (int i = 0; i < face; i++) { + dp[0][i] = 1; + } + int flag = 1; + for (int i = 1; i < n; i++) { + for (int j = i; j < pointNum; j++) { // 使用 i 个骰子最小点数为 i + for (int k = 1; k <= face; k++) { + if (j - k < 0) continue; + dp[flag][j] += dp[1 - flag][j - k]; + } + } + } + + int totalNum = (int) Math.pow(6, n); + return (double) dp[n - 1][s - 1] / totalNum; +} +``` + ## 61. 扑克牌顺子 **题目描述** diff --git a/notes/算法.md b/notes/算法.md index bdad52f6..c9ff1afb 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -98,7 +98,7 @@ T(N)=aN3 转换为 lg(T(N))=3lgN+lga **增长数量级** -增长数量级将算法与它的实现隔离开来,一个算法的增长数量级为 N3 与它是否用 Java 实现,是否运行与特定计算机上无关。 +增长数量级将算法与它的实现隔离开来,一个算法的增长数量级为 N3 与它是否用 Java 实现,是否运行于特定计算机上无关。 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics//1ea4dc9a-c4dd-46b5-bb11-49f98d57ded1.png)