From 804223547818e1cd8a7fefe37d8698f91fd197e7 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Thu, 23 Mar 2023 11:44:55 +0800 Subject: [PATCH 1/4] feat: add solutions to lc problem: No.1692 No.1692.Count Ways to Distribute Candies --- .../README.md | 75 ++++++++++++++++++- .../README_EN.md | 61 ++++++++++++++- .../Solution.cpp | 15 ++++ .../Solution.go | 14 ++++ .../Solution.java | 13 ++++ .../Solution.py | 9 +++ 6 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.cpp create mode 100644 solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.go create mode 100644 solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.java create mode 100644 solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.py diff --git a/solution/1600-1699/1692.Count Ways to Distribute Candies/README.md b/solution/1600-1699/1692.Count Ways to Distribute Candies/README.md index c8e3defb0f90d..03e3f9ba20131 100644 --- a/solution/1600-1699/1692.Count Ways to Distribute Candies/README.md +++ b/solution/1600-1699/1692.Count Ways to Distribute Candies/README.md @@ -64,6 +64,20 @@ +**方法一:动态规划** + +我们定义 $f[i][j]$ 表示将 $i$ 个糖果分配给 $j$ 个手袋的不同分配方式的数量。初始时 $f[0][0]=1$,答案为 $f[n][k]$。 + +我们考虑第 $i$ 个糖果如何分配,如果第 $i$ 个糖果分配给一个新的手袋,那么 $f[i][j]=f[i-1][j-1]$;如果第 $i$ 个糖果分配给一个已有的手袋,那么 $f[i][j]=f[i-1][j]\times j$。因此,状态转移方程为: + +$$ +f[i][j]=f[i-1][j-1]+f[i-1][j]\times j +$$ + +最终的答案为 $f[n][k]$。 + +时间复杂度 $O(n \times k)$,空间复杂度 $O(n \times k)$。其中 $n$ 和 $k$ 分别为糖果的数量和手袋的数量。 + ### **Python3** @@ -71,7 +85,15 @@ ```python - +class Solution: + def waysToDistribute(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [[0] * (k + 1) for _ in range(n + 1)] + f[0][0] = 1 + for i in range(1, n + 1): + for j in range(1, k + 1): + f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % mod + return f[n][k] ``` ### **Java** @@ -79,7 +101,58 @@ ```java +class Solution { + public int waysToDistribute(int n, int k) { + final int mod = (int) 1e9 + 7; + int[][] f = new int[n + 1][k + 1]; + f[0][0] = 1; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= k; j++) { + f[i][j] = (int) ((long) f[i - 1][j] * j % mod + f[i - 1][j - 1]) % mod; + } + } + return f[n][k]; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + int waysToDistribute(int n, int k) { + const int mod = 1e9 + 7; + int f[n + 1][k + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (1LL * f[i - 1][j] * j + f[i - 1][j - 1]) % mod; + } + } + return f[n][k]; + } +}; +``` +### **Go** + +```go +func waysToDistribute(n int, k int) int { + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, k+1) + } + f[0][0] = 1 + const mod = 1e9 + 7 + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + f[i][j] = (f[i-1][j]*j + f[i-1][j-1]) % mod + } + } + return f[n][k] +} ``` ### **...** diff --git a/solution/1600-1699/1692.Count Ways to Distribute Candies/README_EN.md b/solution/1600-1699/1692.Count Ways to Distribute Candies/README_EN.md index 5f7fd71c56b71..5d30a7c0f6021 100644 --- a/solution/1600-1699/1692.Count Ways to Distribute Candies/README_EN.md +++ b/solution/1600-1699/1692.Count Ways to Distribute Candies/README_EN.md @@ -63,13 +63,72 @@ ### **Python3** ```python - +class Solution: + def waysToDistribute(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [[0] * (k + 1) for _ in range(n + 1)] + f[0][0] = 1 + for i in range(1, n + 1): + for j in range(1, k + 1): + f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % mod + return f[n][k] ``` ### **Java** ```java +class Solution { + public int waysToDistribute(int n, int k) { + final int mod = (int) 1e9 + 7; + int[][] f = new int[n + 1][k + 1]; + f[0][0] = 1; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= k; j++) { + f[i][j] = (int) ((long) f[i - 1][j] * j % mod + f[i - 1][j - 1]) % mod; + } + } + return f[n][k]; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + int waysToDistribute(int n, int k) { + const int mod = 1e9 + 7; + int f[n + 1][k + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (1LL * f[i - 1][j] * j + f[i - 1][j - 1]) % mod; + } + } + return f[n][k]; + } +}; +``` +### **Go** + +```go +func waysToDistribute(n int, k int) int { + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, k+1) + } + f[0][0] = 1 + const mod = 1e9 + 7 + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + f[i][j] = (f[i-1][j]*j + f[i-1][j-1]) % mod + } + } + return f[n][k] +} ``` ### **...** diff --git a/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.cpp b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.cpp new file mode 100644 index 0000000000000..f22badef14356 --- /dev/null +++ b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.cpp @@ -0,0 +1,15 @@ +class Solution { +public: + int waysToDistribute(int n, int k) { + const int mod = 1e9 + 7; + int f[n + 1][k + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (1LL * f[i - 1][j] * j + f[i - 1][j - 1]) % mod; + } + } + return f[n][k]; + } +}; \ No newline at end of file diff --git a/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.go b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.go new file mode 100644 index 0000000000000..69a66d839691a --- /dev/null +++ b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.go @@ -0,0 +1,14 @@ +func waysToDistribute(n int, k int) int { + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, k+1) + } + f[0][0] = 1 + const mod = 1e9 + 7 + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + f[i][j] = (f[i-1][j]*j + f[i-1][j-1]) % mod + } + } + return f[n][k] +} \ No newline at end of file diff --git a/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.java b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.java new file mode 100644 index 0000000000000..f87d67154c0cf --- /dev/null +++ b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.java @@ -0,0 +1,13 @@ +class Solution { + public int waysToDistribute(int n, int k) { + final int mod = (int) 1e9 + 7; + int[][] f = new int[n + 1][k + 1]; + f[0][0] = 1; + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= k; j++) { + f[i][j] = (int) ((long) f[i - 1][j] * j % mod + f[i - 1][j - 1]) % mod; + } + } + return f[n][k]; + } +} \ No newline at end of file diff --git a/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.py b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.py new file mode 100644 index 0000000000000..11406c9fae6f9 --- /dev/null +++ b/solution/1600-1699/1692.Count Ways to Distribute Candies/Solution.py @@ -0,0 +1,9 @@ +class Solution: + def waysToDistribute(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [[0] * (k + 1) for _ in range(n + 1)] + f[0][0] = 1 + for i in range(1, n + 1): + for j in range(1, k + 1): + f[i][j] = (f[i - 1][j] * j + f[i - 1][j - 1]) % mod + return f[n][k] From 13f95a5032fb408a53405f5f4a16c7c8e5ee87e4 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Thu, 23 Mar 2023 17:05:10 +0800 Subject: [PATCH 2/4] feat: add solutions to lc problem: No.1866 No.1866.Number of Ways to Rearrange Sticks With K Sticks Visible --- .../0879.Profitable Schemes/Solution.py | 10 +- .../Solution.py | 3 +- .../README.md | 140 ++++++++++++++++++ .../README_EN.md | 122 +++++++++++++++ .../Solution.cpp | 16 ++ .../Solution.go | 12 ++ .../Solution.java | 14 ++ .../Solution.py | 9 ++ 8 files changed, 319 insertions(+), 7 deletions(-) create mode 100644 solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.cpp create mode 100644 solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.go create mode 100644 solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.java create mode 100644 solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.py diff --git a/solution/0800-0899/0879.Profitable Schemes/Solution.py b/solution/0800-0899/0879.Profitable Schemes/Solution.py index 4d56c7e41dbb1..ec548940a47e2 100644 --- a/solution/0800-0899/0879.Profitable Schemes/Solution.py +++ b/solution/0800-0899/0879.Profitable Schemes/Solution.py @@ -1,9 +1,10 @@ class Solution: - def profitableSchemes(self, n: int, minProfit: int, group: List[int], profit: List[int]) -> int: + def profitableSchemes( + self, n: int, minProfit: int, group: List[int], profit: List[int] + ) -> int: mod = 10**9 + 7 m = len(group) - f = [[[0] * (minProfit + 1) for _ in range(n + 1)] - for _ in range(m + 1)] + f = [[[0] * (minProfit + 1) for _ in range(n + 1)] for _ in range(m + 1)] for j in range(n + 1): f[0][j][0] = 1 for i, (x, p) in enumerate(zip(group, profit), 1): @@ -11,6 +12,5 @@ def profitableSchemes(self, n: int, minProfit: int, group: List[int], profit: Li for k in range(minProfit + 1): f[i][j][k] = f[i - 1][j][k] if j >= x: - f[i][j][k] = (f[i][j][k] + f[i - 1] - [j - x][max(0, k - p)]) % mod + f[i][j][k] = (f[i][j][k] + f[i - 1][j - x][max(0, k - p)]) % mod return f[m][n][minProfit] diff --git a/solution/1000-1099/1012.Numbers With Repeated Digits/Solution.py b/solution/1000-1099/1012.Numbers With Repeated Digits/Solution.py index 9eba1daebcac0..2f9732635eb58 100644 --- a/solution/1000-1099/1012.Numbers With Repeated Digits/Solution.py +++ b/solution/1000-1099/1012.Numbers With Repeated Digits/Solution.py @@ -15,8 +15,7 @@ def dfs(pos: int, mask: int, lead: bool, limit: bool) -> int: if i == 0 and lead: ans += dfs(pos - 1, mask, lead, limit and i == up) else: - ans += dfs(pos - 1, mask | 1 << i, - False, limit and i == up) + ans += dfs(pos - 1, mask | 1 << i, False, limit and i == up) return ans nums = [] diff --git a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README.md b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README.md index c35aee9170874..855655640c354 100644 --- a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README.md +++ b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README.md @@ -52,6 +52,24 @@ +**方法一:动态规划** + +我们定义 $f[i][j]$ 表示长度为 $i$ 的排列中,恰有 $j$ 根木棍可以看到的排列数目。初始时 $f[0][0]=1$,其余 $f[i][j]=0$。答案为 $f[n][k]$。 + +考虑最后一根木棍是否可以看到,如果可以看到,那么它一定是最长的,那么它的前面有 $i - 1$ 根木棍,恰有 $j - 1$ 根木棍可以看到,即 $f[i - 1][j - 1]$;如果最后一根木棍不可以看到,那么它可以是除了最长的木棍之外的任意一根,那么它的前面有 $i - 1$ 根木棍,恰有 $j$ 根木棍可以看到,即 $f[i - 1][j] \times (i - 1)$。 + +因此,状态转移方程为: + +$$ +f[i][j] = f[i - 1][j - 1] + f[i - 1][j] \times (i - 1) +$$ + +最终答案为 $f[n][k]$。 + +我们注意到 $f[i][j]$ 只跟 $f[i - 1][j - 1]$ 和 $f[i - 1][j]$ 有关,因此可以使用一维数组优化空间复杂度。 + +时间复杂度 $O(n \times k)$,空间复杂度 $O(k)$。其中 $n$ 和 $k$ 分别是题目中给定的两个整数。 + ### **Python3** @@ -59,7 +77,27 @@ ```python +class Solution: + def rearrangeSticks(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [[0] * (k + 1) for _ in range(n + 1)] + f[0][0] = 1 + for i in range(1, n + 1): + for j in range(1, k + 1): + f[i][j] = (f[i - 1][j - 1] + f[i - 1][j] * (i - 1)) % mod + return f[n][k] +``` +```python +class Solution: + def rearrangeSticks(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [1] + [0] * k + for i in range(1, n + 1): + for j in range(k, 0, -1): + f[j] = (f[j] * (i - 1) + f[j - 1]) % mod + f[0] = 0 + return f[k] ``` ### **Java** @@ -67,7 +105,109 @@ ```java +class Solution { + public int rearrangeSticks(int n, int k) { + final int mod = (int) 1e9 + 7; + int[][] f = new int[n + 1][k + 1]; + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (int) ((f[i - 1][j - 1] + f[i - 1][j] * (long) (i - 1)) % mod); + } + } + return f[n][k]; + } +} +``` + +```java +class Solution { + public int rearrangeSticks(int n, int k) { + final int mod = (int) 1e9 + 7; + int[] f = new int[k + 1]; + f[0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = k; j > 0; --j) { + f[j] = (int) ((f[j] * (i - 1L) + f[j - 1]) % mod); + } + f[0] = 0; + } + return f[k]; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + int rearrangeSticks(int n, int k) { + const int mod = 1e9 + 7; + int f[n + 1][k + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (f[i - 1][j - 1] + (i - 1LL) * f[i - 1][j]) % mod; + } + } + return f[n][k]; + } +}; +``` + +```cpp +class Solution { +public: + int rearrangeSticks(int n, int k) { + const int mod = 1e9 + 7; + int f[k + 1]; + memset(f, 0, sizeof(f)); + f[0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = k; j; --j) { + f[j] = (f[j - 1] + f[j] * (i - 1LL)) % mod; + } + f[0] = 0; + } + return f[k]; + } +}; +``` + +### **Go** + +```go +func rearrangeSticks(n int, k int) int { + const mod = 1e9 + 7 + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, k+1) + } + f[0][0] = 1 + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + f[i][j] = (f[i-1][j-1] + (i-1)*f[i-1][j]) % mod + } + } + return f[n][k] +} +``` +```go +func rearrangeSticks(n int, k int) int { + const mod = 1e9 + 7 + f := make([]int, k+1) + f[0] = 1 + for i := 1; i <= n; i++ { + for j := k; j > 0; j-- { + f[j] = (f[j-1] + f[j]*(i-1)) % mod + } + f[0] = 0 + } + return f[k] +} ``` ### **...** diff --git a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README_EN.md b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README_EN.md index 4755574ce0ea6..c90feca686b44 100644 --- a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README_EN.md +++ b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README_EN.md @@ -54,13 +54,135 @@ The visible sticks are underlined. ### **Python3** ```python +class Solution: + def rearrangeSticks(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [1] + [0] * k + for i in range(1, n + 1): + for j in range(k, 0, -1): + f[j] = (f[j] * (i - 1) + f[j - 1]) % mod + f[0] = 0 + return f[k] +``` +```python +class Solution: + def rearrangeSticks(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [1] + [0] * k + for i in range(1, n + 1): + for j in range(k, 0, -1): + f[j] = (f[j] * (i - 1) + f[j - 1]) % mod + f[0] = 0 + return f[k] ``` ### **Java** ```java +class Solution { + public int rearrangeSticks(int n, int k) { + final int mod = (int) 1e9 + 7; + int[][] f = new int[n + 1][k + 1]; + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (int) ((f[i - 1][j - 1] + f[i - 1][j] * (long) (i - 1)) % mod); + } + } + return f[n][k]; + } +} +``` + +```java +class Solution { + public int rearrangeSticks(int n, int k) { + final int mod = (int) 1e9 + 7; + int[] f = new int[k + 1]; + f[0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = k; j > 0; --j) { + f[j] = (int) ((f[j] * (i - 1L) + f[j - 1]) % mod); + } + f[0] = 0; + } + return f[k]; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + int rearrangeSticks(int n, int k) { + const int mod = 1e9 + 7; + int f[n + 1][k + 1]; + memset(f, 0, sizeof(f)); + f[0][0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = 1; j <= k; ++j) { + f[i][j] = (f[i - 1][j - 1] + (i - 1LL) * f[i - 1][j]) % mod; + } + } + return f[n][k]; + } +}; +``` + +```cpp +class Solution { +public: + int rearrangeSticks(int n, int k) { + const int mod = 1e9 + 7; + int f[k + 1]; + memset(f, 0, sizeof(f)); + f[0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = k; j; --j) { + f[j] = (f[j - 1] + f[j] * (i - 1LL)) % mod; + } + f[0] = 0; + } + return f[k]; + } +}; +``` + +### **Go** + +```go +func rearrangeSticks(n int, k int) int { + const mod = 1e9 + 7 + f := make([][]int, n+1) + for i := range f { + f[i] = make([]int, k+1) + } + f[0][0] = 1 + for i := 1; i <= n; i++ { + for j := 1; j <= k; j++ { + f[i][j] = (f[i-1][j-1] + (i-1)*f[i-1][j]) % mod + } + } + return f[n][k] +} +``` +```go +func rearrangeSticks(n int, k int) int { + const mod = 1e9 + 7 + f := make([]int, k+1) + f[0] = 1 + for i := 1; i <= n; i++ { + for j := k; j > 0; j-- { + f[j] = (f[j-1] + f[j]*(i-1)) % mod + } + f[0] = 0 + } + return f[k] +} ``` ### **...** diff --git a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.cpp b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.cpp new file mode 100644 index 0000000000000..96d9eafacc5f5 --- /dev/null +++ b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.cpp @@ -0,0 +1,16 @@ +class Solution { +public: + int rearrangeSticks(int n, int k) { + const int mod = 1e9 + 7; + int f[k + 1]; + memset(f, 0, sizeof(f)); + f[0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = k; j; --j) { + f[j] = (f[j - 1] + f[j] * (i - 1LL)) % mod; + } + f[0] = 0; + } + return f[k]; + } +}; \ No newline at end of file diff --git a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.go b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.go new file mode 100644 index 0000000000000..c38d267742319 --- /dev/null +++ b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.go @@ -0,0 +1,12 @@ +func rearrangeSticks(n int, k int) int { + const mod = 1e9 + 7 + f := make([]int, k+1) + f[0] = 1 + for i := 1; i <= n; i++ { + for j := k; j > 0; j-- { + f[j] = (f[j-1] + f[j]*(i-1)) % mod + } + f[0] = 0 + } + return f[k] +} \ No newline at end of file diff --git a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.java b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.java new file mode 100644 index 0000000000000..ca00628b42efa --- /dev/null +++ b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.java @@ -0,0 +1,14 @@ +class Solution { + public int rearrangeSticks(int n, int k) { + final int mod = (int) 1e9 + 7; + int[] f = new int[k + 1]; + f[0] = 1; + for (int i = 1; i <= n; ++i) { + for (int j = k; j > 0; --j) { + f[j] = (int) ((f[j] * (i - 1L) + f[j - 1]) % mod); + } + f[0] = 0; + } + return f[k]; + } +} \ No newline at end of file diff --git a/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.py b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.py new file mode 100644 index 0000000000000..36d9ced797804 --- /dev/null +++ b/solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/Solution.py @@ -0,0 +1,9 @@ +class Solution: + def rearrangeSticks(self, n: int, k: int) -> int: + mod = 10**9 + 7 + f = [1] + [0] * k + for i in range(1, n + 1): + for j in range(k, 0, -1): + f[j] = (f[j] * (i - 1) + f[j - 1]) % mod + f[0] = 0 + return f[k] From 0d0465d54b80044ec1aadc1fe612dd9474231675 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Thu, 23 Mar 2023 19:40:55 +0800 Subject: [PATCH 3/4] feat: update solutions to lc problem: No.1034 No.1034.Coloring A Border --- .../1034.Coloring A Border/README.md | 120 ++++++++++-------- .../1034.Coloring A Border/README_EN.md | 114 +++++++++-------- .../1034.Coloring A Border/Solution.cpp | 48 +++---- .../1034.Coloring A Border/Solution.go | 20 ++- .../1034.Coloring A Border/Solution.java | 28 ++-- .../1034.Coloring A Border/Solution.py | 18 ++- 6 files changed, 182 insertions(+), 166 deletions(-) diff --git a/solution/1000-1099/1034.Coloring A Border/README.md b/solution/1000-1099/1034.Coloring A Border/README.md index cbd0d850653fe..25cb30bb0a7f6 100644 --- a/solution/1000-1099/1034.Coloring A Border/README.md +++ b/solution/1000-1099/1034.Coloring A Border/README.md @@ -63,7 +63,11 @@ -深度优先搜索,利用 vis 记录访问过的位置。 +**方法一:DFS** + +我们从位置 $(row, col)$ 出发,利用 DFS 搜索所有颜色为 $grid[row][col]$ 的网格块,如果该网格块的某个相邻位置的颜色不为 $grid[row][col]$,或者该网格块在网格的边界上,则将该网格块的颜色改为 $color$。 + +时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是网格的行数和列数。 @@ -76,24 +80,22 @@ class Solution: def colorBorder( self, grid: List[List[int]], row: int, col: int, color: int ) -> List[List[int]]: - m, n = len(grid), len(grid[0]) - vis = [[False] * n for _ in range(m)] - - def dfs(i, j, color): + def dfs(i: int, j: int, c: int) -> None: vis[i][j] = True - old_color = grid[i][j] - for a, b in [[-1, 0], [1, 0], [0, -1], [0, 1]]: - x, y = a + i, b + j + for a, b in pairwise((-1, 0, 1, 0, -1)): + x, y = i + a, j + b if 0 <= x < m and 0 <= y < n: if not vis[x][y]: - if grid[x][y] == old_color: - dfs(x, y, color) + if grid[x][y] == c: + dfs(x, y, c) else: grid[i][j] = color else: grid[i][j] = color - dfs(row, col, color) + m, n = len(grid), len(grid[0]) + vis = [[False] * n for _ in range(m)] + dfs(row, col, grid[row][col]) return grid ``` @@ -103,23 +105,31 @@ class Solution: ```java class Solution { - private int[] dirs = new int[] {-1, 0, 1, 0, -1}; - - public int[][] colorBorder(int[][] grid, int r0, int c0, int color) { - boolean[][] vis = new boolean[grid.length][grid[0].length]; - dfs(grid, r0, c0, color, vis); + private int[][] grid; + private int color; + private int m; + private int n; + private boolean[][] vis; + + public int[][] colorBorder(int[][] grid, int row, int col, int color) { + this.grid = grid; + this.color = color; + m = grid.length; + n = grid[0].length; + vis = new boolean[m][n]; + dfs(row, col, grid[row][col]); return grid; } - private void dfs(int[][] grid, int i, int j, int color, boolean[][] vis) { + private void dfs(int i, int j, int c) { vis[i][j] = true; - int oldColor = grid[i][j]; + int[] dirs = {-1, 0, 1, 0, -1}; for (int k = 0; k < 4; ++k) { int x = i + dirs[k], y = j + dirs[k + 1]; - if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length) { + if (x >= 0 && x < m && y >= 0 && y < n) { if (!vis[x][y]) { - if (grid[x][y] == oldColor) { - dfs(grid, x, y, color, vis); + if (grid[x][y] == c) { + dfs(x, y, c); } else { grid[i][j] = color; } @@ -137,32 +147,32 @@ class Solution { ```cpp class Solution { public: - int m, n; - vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; - vector> colorBorder(vector>& grid, int row, int col, int color) { - m = grid.size(); - n = grid[0].size(); - vector> vis(m, vector(n, false)); - dfs(row, col, color, grid, vis); - return grid; - } - - void dfs(int i, int j, int color, vector>& grid, vector>& vis) { - vis[i][j] = true; - int oldColor = grid[i][j]; - for (auto& dir : dirs) { - int x = i + dir[0], y = j + dir[1]; - if (x >= 0 && x < m && y >= 0 && y < n) { - if (!vis[x][y]) { - if (grid[x][y] == oldColor) - dfs(x, y, color, grid, vis); - else - grid[i][j] = color; + int m = grid.size(); + int n = grid[0].size(); + bool vis[m][n]; + memset(vis, false, sizeof(vis)); + int dirs[5] = {-1, 0, 1, 0, -1}; + function dfs = [&](int i, int j, int c) { + vis[i][j] = true; + for (int k = 0; k < 4; ++k) { + int x = i + dirs[k]; + int y = j + dirs[k + 1]; + if (x >= 0 && x < m && y >= 0 && y < n) { + if (!vis[x][y]) { + if (grid[x][y] == c) { + dfs(x, y, c); + } else { + grid[i][j] = color; + } + } + } else { + grid[i][j] = color; } - } else - grid[i][j] = color; - } + } + }; + dfs(row, col, grid[row][col]); + return grid; } }; ``` @@ -173,21 +183,19 @@ public: func colorBorder(grid [][]int, row int, col int, color int) [][]int { m, n := len(grid), len(grid[0]) vis := make([][]bool, m) - for i := 0; i < m; i++ { + for i := range vis { vis[i] = make([]bool, n) } - dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}} - - var dfs func(i, j, color int) - dfs = func(i, j, color int) { + dirs := [5]int{-1, 0, 1, 0, -1} + var dfs func(int, int, int) + dfs = func(i, j, c int) { vis[i][j] = true - oldColor := grid[i][j] - for _, dir := range dirs { - x, y := i+dir[0], j+dir[1] + for k := 0; k < 4; k++ { + x, y := i+dirs[k], j+dirs[k+1] if x >= 0 && x < m && y >= 0 && y < n { if !vis[x][y] { - if grid[x][y] == oldColor { - dfs(x, y, color) + if grid[x][y] == c { + dfs(x, y, c) } else { grid[i][j] = color } @@ -197,7 +205,7 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int { } } } - dfs(row, col, color) + dfs(row, col, grid[row][col]) return grid } ``` diff --git a/solution/1000-1099/1034.Coloring A Border/README_EN.md b/solution/1000-1099/1034.Coloring A Border/README_EN.md index c71502bb10c4f..a1edb629d8f3e 100644 --- a/solution/1000-1099/1034.Coloring A Border/README_EN.md +++ b/solution/1000-1099/1034.Coloring A Border/README_EN.md @@ -48,24 +48,22 @@ class Solution: def colorBorder( self, grid: List[List[int]], row: int, col: int, color: int ) -> List[List[int]]: - m, n = len(grid), len(grid[0]) - vis = [[False] * n for _ in range(m)] - - def dfs(i, j, color): + def dfs(i: int, j: int, c: int) -> None: vis[i][j] = True - old_color = grid[i][j] - for a, b in [[-1, 0], [1, 0], [0, -1], [0, 1]]: - x, y = a + i, b + j + for a, b in pairwise((-1, 0, 1, 0, -1)): + x, y = i + a, j + b if 0 <= x < m and 0 <= y < n: if not vis[x][y]: - if grid[x][y] == old_color: - dfs(x, y, color) + if grid[x][y] == c: + dfs(x, y, c) else: grid[i][j] = color else: grid[i][j] = color - dfs(row, col, color) + m, n = len(grid), len(grid[0]) + vis = [[False] * n for _ in range(m)] + dfs(row, col, grid[row][col]) return grid ``` @@ -73,23 +71,31 @@ class Solution: ```java class Solution { - private int[] dirs = new int[] {-1, 0, 1, 0, -1}; - - public int[][] colorBorder(int[][] grid, int r0, int c0, int color) { - boolean[][] vis = new boolean[grid.length][grid[0].length]; - dfs(grid, r0, c0, color, vis); + private int[][] grid; + private int color; + private int m; + private int n; + private boolean[][] vis; + + public int[][] colorBorder(int[][] grid, int row, int col, int color) { + this.grid = grid; + this.color = color; + m = grid.length; + n = grid[0].length; + vis = new boolean[m][n]; + dfs(row, col, grid[row][col]); return grid; } - private void dfs(int[][] grid, int i, int j, int color, boolean[][] vis) { + private void dfs(int i, int j, int c) { vis[i][j] = true; - int oldColor = grid[i][j]; + int[] dirs = {-1, 0, 1, 0, -1}; for (int k = 0; k < 4; ++k) { int x = i + dirs[k], y = j + dirs[k + 1]; - if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length) { + if (x >= 0 && x < m && y >= 0 && y < n) { if (!vis[x][y]) { - if (grid[x][y] == oldColor) { - dfs(grid, x, y, color, vis); + if (grid[x][y] == c) { + dfs(x, y, c); } else { grid[i][j] = color; } @@ -107,32 +113,32 @@ class Solution { ```cpp class Solution { public: - int m, n; - vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; - vector> colorBorder(vector>& grid, int row, int col, int color) { - m = grid.size(); - n = grid[0].size(); - vector> vis(m, vector(n, false)); - dfs(row, col, color, grid, vis); - return grid; - } - - void dfs(int i, int j, int color, vector>& grid, vector>& vis) { - vis[i][j] = true; - int oldColor = grid[i][j]; - for (auto& dir : dirs) { - int x = i + dir[0], y = j + dir[1]; - if (x >= 0 && x < m && y >= 0 && y < n) { - if (!vis[x][y]) { - if (grid[x][y] == oldColor) - dfs(x, y, color, grid, vis); - else - grid[i][j] = color; + int m = grid.size(); + int n = grid[0].size(); + bool vis[m][n]; + memset(vis, false, sizeof(vis)); + int dirs[5] = {-1, 0, 1, 0, -1}; + function dfs = [&](int i, int j, int c) { + vis[i][j] = true; + for (int k = 0; k < 4; ++k) { + int x = i + dirs[k]; + int y = j + dirs[k + 1]; + if (x >= 0 && x < m && y >= 0 && y < n) { + if (!vis[x][y]) { + if (grid[x][y] == c) { + dfs(x, y, c); + } else { + grid[i][j] = color; + } + } + } else { + grid[i][j] = color; } - } else - grid[i][j] = color; - } + } + }; + dfs(row, col, grid[row][col]); + return grid; } }; ``` @@ -143,21 +149,19 @@ public: func colorBorder(grid [][]int, row int, col int, color int) [][]int { m, n := len(grid), len(grid[0]) vis := make([][]bool, m) - for i := 0; i < m; i++ { + for i := range vis { vis[i] = make([]bool, n) } - dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}} - - var dfs func(i, j, color int) - dfs = func(i, j, color int) { + dirs := [5]int{-1, 0, 1, 0, -1} + var dfs func(int, int, int) + dfs = func(i, j, c int) { vis[i][j] = true - oldColor := grid[i][j] - for _, dir := range dirs { - x, y := i+dir[0], j+dir[1] + for k := 0; k < 4; k++ { + x, y := i+dirs[k], j+dirs[k+1] if x >= 0 && x < m && y >= 0 && y < n { if !vis[x][y] { - if grid[x][y] == oldColor { - dfs(x, y, color) + if grid[x][y] == c { + dfs(x, y, c) } else { grid[i][j] = color } @@ -167,7 +171,7 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int { } } } - dfs(row, col, color) + dfs(row, col, grid[row][col]) return grid } ``` diff --git a/solution/1000-1099/1034.Coloring A Border/Solution.cpp b/solution/1000-1099/1034.Coloring A Border/Solution.cpp index b0c97af31ff92..c00caa1200646 100644 --- a/solution/1000-1099/1034.Coloring A Border/Solution.cpp +++ b/solution/1000-1099/1034.Coloring A Border/Solution.cpp @@ -1,30 +1,30 @@ class Solution { public: - int m, n; - vector> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; - vector> colorBorder(vector>& grid, int row, int col, int color) { - m = grid.size(); - n = grid[0].size(); - vector> vis(m, vector(n, false)); - dfs(row, col, color, grid, vis); - return grid; - } - - void dfs(int i, int j, int color, vector>& grid, vector>& vis) { - vis[i][j] = true; - int oldColor = grid[i][j]; - for (auto& dir : dirs) { - int x = i + dir[0], y = j + dir[1]; - if (x >= 0 && x < m && y >= 0 && y < n) { - if (!vis[x][y]) { - if (grid[x][y] == oldColor) - dfs(x, y, color, grid, vis); - else - grid[i][j] = color; + int m = grid.size(); + int n = grid[0].size(); + bool vis[m][n]; + memset(vis, false, sizeof(vis)); + int dirs[5] = {-1, 0, 1, 0, -1}; + function dfs = [&](int i, int j, int c) { + vis[i][j] = true; + for (int k = 0; k < 4; ++k) { + int x = i + dirs[k]; + int y = j + dirs[k + 1]; + if (x >= 0 && x < m && y >= 0 && y < n) { + if (!vis[x][y]) { + if (grid[x][y] == c) { + dfs(x, y, c); + } else { + grid[i][j] = color; + } + } + } else { + grid[i][j] = color; } - } else - grid[i][j] = color; - } + } + }; + dfs(row, col, grid[row][col]); + return grid; } }; \ No newline at end of file diff --git a/solution/1000-1099/1034.Coloring A Border/Solution.go b/solution/1000-1099/1034.Coloring A Border/Solution.go index d9a0e05707db6..d67c5be5eda99 100644 --- a/solution/1000-1099/1034.Coloring A Border/Solution.go +++ b/solution/1000-1099/1034.Coloring A Border/Solution.go @@ -1,21 +1,19 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int { m, n := len(grid), len(grid[0]) vis := make([][]bool, m) - for i := 0; i < m; i++ { + for i := range vis { vis[i] = make([]bool, n) } - dirs := [4][2]int{{0, -1}, {0, 1}, {1, 0}, {-1, 0}} - - var dfs func(i, j, color int) - dfs = func(i, j, color int) { + dirs := [5]int{-1, 0, 1, 0, -1} + var dfs func(int, int, int) + dfs = func(i, j, c int) { vis[i][j] = true - oldColor := grid[i][j] - for _, dir := range dirs { - x, y := i+dir[0], j+dir[1] + for k := 0; k < 4; k++ { + x, y := i+dirs[k], j+dirs[k+1] if x >= 0 && x < m && y >= 0 && y < n { if !vis[x][y] { - if grid[x][y] == oldColor { - dfs(x, y, color) + if grid[x][y] == c { + dfs(x, y, c) } else { grid[i][j] = color } @@ -25,6 +23,6 @@ func colorBorder(grid [][]int, row int, col int, color int) [][]int { } } } - dfs(row, col, color) + dfs(row, col, grid[row][col]) return grid } \ No newline at end of file diff --git a/solution/1000-1099/1034.Coloring A Border/Solution.java b/solution/1000-1099/1034.Coloring A Border/Solution.java index 9c757e75eb132..d4e68abb0df66 100644 --- a/solution/1000-1099/1034.Coloring A Border/Solution.java +++ b/solution/1000-1099/1034.Coloring A Border/Solution.java @@ -1,21 +1,29 @@ class Solution { - private int[] dirs = new int[] {-1, 0, 1, 0, -1}; + private int[][] grid; + private int color; + private int m; + private int n; + private boolean[][] vis; - public int[][] colorBorder(int[][] grid, int r0, int c0, int color) { - boolean[][] vis = new boolean[grid.length][grid[0].length]; - dfs(grid, r0, c0, color, vis); + public int[][] colorBorder(int[][] grid, int row, int col, int color) { + this.grid = grid; + this.color = color; + m = grid.length; + n = grid[0].length; + vis = new boolean[m][n]; + dfs(row, col, grid[row][col]); return grid; } - private void dfs(int[][] grid, int i, int j, int color, boolean[][] vis) { + private void dfs(int i, int j, int c) { vis[i][j] = true; - int oldColor = grid[i][j]; + int[] dirs = {-1, 0, 1, 0, -1}; for (int k = 0; k < 4; ++k) { int x = i + dirs[k], y = j + dirs[k + 1]; - if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length) { + if (x >= 0 && x < m && y >= 0 && y < n) { if (!vis[x][y]) { - if (grid[x][y] == oldColor) { - dfs(grid, x, y, color, vis); + if (grid[x][y] == c) { + dfs(x, y, c); } else { grid[i][j] = color; } @@ -25,4 +33,4 @@ private void dfs(int[][] grid, int i, int j, int color, boolean[][] vis) { } } } -} +} \ No newline at end of file diff --git a/solution/1000-1099/1034.Coloring A Border/Solution.py b/solution/1000-1099/1034.Coloring A Border/Solution.py index 17251cc610719..575aaea638258 100644 --- a/solution/1000-1099/1034.Coloring A Border/Solution.py +++ b/solution/1000-1099/1034.Coloring A Border/Solution.py @@ -2,22 +2,20 @@ class Solution: def colorBorder( self, grid: List[List[int]], row: int, col: int, color: int ) -> List[List[int]]: - m, n = len(grid), len(grid[0]) - vis = [[False] * n for _ in range(m)] - - def dfs(i, j, color): + def dfs(i: int, j: int, c: int) -> None: vis[i][j] = True - old_color = grid[i][j] - for a, b in [[-1, 0], [1, 0], [0, -1], [0, 1]]: - x, y = a + i, b + j + for a, b in pairwise((-1, 0, 1, 0, -1)): + x, y = i + a, j + b if 0 <= x < m and 0 <= y < n: if not vis[x][y]: - if grid[x][y] == old_color: - dfs(x, y, color) + if grid[x][y] == c: + dfs(x, y, c) else: grid[i][j] = color else: grid[i][j] = color - dfs(row, col, color) + m, n = len(grid), len(grid[0]) + vis = [[False] * n for _ in range(m)] + dfs(row, col, grid[row][col]) return grid From 8d2a07b934c57015296f9a42526f3b7c438cb7a2 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Thu, 23 Mar 2023 20:10:08 +0800 Subject: [PATCH 4/4] feat: update solutions to lc problem: No.1033 No.1033.Moving Stones Until Consecutive --- .../README.md | 71 ++++++++++--------- .../README_EN.md | 56 ++++++++------- .../Solution.cpp | 12 ++-- .../Solution.go | 18 ++--- .../Solution.java | 11 +-- .../Solution.py | 17 ++--- 6 files changed, 98 insertions(+), 87 deletions(-) diff --git a/solution/1000-1099/1033.Moving Stones Until Consecutive/README.md b/solution/1000-1099/1033.Moving Stones Until Consecutive/README.md index 39c76a5a08ac2..61fb825847249 100644 --- a/solution/1000-1099/1033.Moving Stones Until Consecutive/README.md +++ b/solution/1000-1099/1033.Moving Stones Until Consecutive/README.md @@ -47,12 +47,17 @@ -**方法一:脑筋急转弯** +**方法一:分类讨论** -- 若 $3$ 个数已经相邻,则不用移动,直接返回结果 $[0,0]$; -- 若 $3$ 个数中存在两数之差小于 $3$,最小只需移动 $1$ 次; -- 其他情况最小只需移动 $2$ 次; -- 两边逐个往中间靠,就是最大移动次数 $c - a - 2$。 +我们先将 $a, b, c$ 排序,记为 $x, y, z$,即 $x \lt y \lt z$。 + +接下来分情况讨论: + +1. 如果 $z - x \leq 2$,说明 $3$ 个数已经相邻,不用移动,结果为 $[0, 0]$; +1. 否则,如果 $y - x \lt 3$,或者 $z - y \lt 3$,说明有两个数只间隔一个位置,我们只需要把另一个数移动到这两个数的中间,最小移动次数为 $1$;其他情况,最小移动次数为 $2$; +1. 最大移动次数就是两边的数字逐个往中间靠,最多移动 $z - x - 2$ 次。 + +时间复杂度 $O(1)$,空间复杂度 $O(1)$。 @@ -63,16 +68,13 @@ ```python class Solution: def numMovesStones(self, a: int, b: int, c: int) -> List[int]: - a, b, c = sorted([a, b, c]) - ans = [0] * 2 - if c - a == 2: - return ans - if b - a < 3 or c - b < 3: - ans[0] = 1 - else: - ans[0] = 2 - ans[1] = c - a - 2 - return ans + x, z = min(a, b, c), max(a, b, c) + y = a + b + c - x - z + mi = mx = 0 + if z - x > 2: + mi = 1 if y - x < 3 or z - y < 3 else 2 + mx = z - x - 2 + return [mi, mx] ``` ### **Java** @@ -85,9 +87,12 @@ class Solution { int x = Math.min(a, Math.min(b, c)); int z = Math.max(a, Math.max(b, c)); int y = a + b + c - x - z; - int max = z - x - 2; - int min = y - x == 1 && z - y == 1 ? 0 : y - x <= 2 || z - y <= 2 ? 1 : 2; - return new int[] {min, max}; + int mi = 0, mx = 0; + if (z - x > 2) { + mi = y - x < 3 || z - y < 3 ? 1 : 2; + mx = z - x - 2; + } + return new int[]{mi, mx}; } } ``` @@ -98,12 +103,14 @@ class Solution { class Solution { public: vector numMovesStones(int a, int b, int c) { - int x = min(min(a, b), c); - int z = max(max(a, b), c); + int x = min({a, b, c}); + int z = max({a, b, c}); int y = a + b + c - x - z; - if (z - x == 2) return {0, 0}; - int mx = z - x - 2; - int mi = y - x < 3 || z - y < 3 ? 1 : 2; + int mi = 0, mx = 0; + if (z - x > 2) { + mi = y - x < 3 || z - y < 3 ? 1 : 2; + mx = z - x - 2; + } return {mi, mx}; } }; @@ -113,16 +120,16 @@ public: ```go func numMovesStones(a int, b int, c int) []int { - x := min(min(a, b), c) - z := max(max(a, b), c) + x := min(a, min(b, c)) + z := max(a, max(b, c)) y := a + b + c - x - z - if z-x == 2 { - return []int{0, 0} - } - mx := z - x - 2 - mi := 2 - if y-x < 3 || z-y < 3 { - mi = 1 + mi, mx := 0, 0 + if z-x > 2 { + mi = 2 + if y-x < 3 || z-y < 3 { + mi = 1 + } + mx = z - x - 2 } return []int{mi, mx} } diff --git a/solution/1000-1099/1033.Moving Stones Until Consecutive/README_EN.md b/solution/1000-1099/1033.Moving Stones Until Consecutive/README_EN.md index 6da72c7974d82..020d2b2c04e48 100644 --- a/solution/1000-1099/1033.Moving Stones Until Consecutive/README_EN.md +++ b/solution/1000-1099/1033.Moving Stones Until Consecutive/README_EN.md @@ -59,16 +59,13 @@ ```python class Solution: def numMovesStones(self, a: int, b: int, c: int) -> List[int]: - a, b, c = sorted([a, b, c]) - ans = [0] * 2 - if c - a == 2: - return ans - if b - a < 3 or c - b < 3: - ans[0] = 1 - else: - ans[0] = 2 - ans[1] = c - a - 2 - return ans + x, z = min(a, b, c), max(a, b, c) + y = a + b + c - x - z + mi = mx = 0 + if z - x > 2: + mi = 1 if y - x < 3 or z - y < 3 else 2 + mx = z - x - 2 + return [mi, mx] ``` ### **Java** @@ -79,9 +76,12 @@ class Solution { int x = Math.min(a, Math.min(b, c)); int z = Math.max(a, Math.max(b, c)); int y = a + b + c - x - z; - int max = z - x - 2; - int min = y - x == 1 && z - y == 1 ? 0 : y - x <= 2 || z - y <= 2 ? 1 : 2; - return new int[] {min, max}; + int mi = 0, mx = 0; + if (z - x > 2) { + mi = y - x < 3 || z - y < 3 ? 1 : 2; + mx = z - x - 2; + } + return new int[]{mi, mx}; } } ``` @@ -92,12 +92,14 @@ class Solution { class Solution { public: vector numMovesStones(int a, int b, int c) { - int x = min(min(a, b), c); - int z = max(max(a, b), c); + int x = min({a, b, c}); + int z = max({a, b, c}); int y = a + b + c - x - z; - if (z - x == 2) return {0, 0}; - int mx = z - x - 2; - int mi = y - x < 3 || z - y < 3 ? 1 : 2; + int mi = 0, mx = 0; + if (z - x > 2) { + mi = y - x < 3 || z - y < 3 ? 1 : 2; + mx = z - x - 2; + } return {mi, mx}; } }; @@ -107,16 +109,16 @@ public: ```go func numMovesStones(a int, b int, c int) []int { - x := min(min(a, b), c) - z := max(max(a, b), c) + x := min(a, min(b, c)) + z := max(a, max(b, c)) y := a + b + c - x - z - if z-x == 2 { - return []int{0, 0} - } - mx := z - x - 2 - mi := 2 - if y-x < 3 || z-y < 3 { - mi = 1 + mi, mx := 0, 0 + if z-x > 2 { + mi = 2 + if y-x < 3 || z-y < 3 { + mi = 1 + } + mx = z - x - 2 } return []int{mi, mx} } diff --git a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.cpp b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.cpp index cf9af0d9ffc3b..31feb01084a01 100644 --- a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.cpp +++ b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.cpp @@ -1,12 +1,14 @@ class Solution { public: vector numMovesStones(int a, int b, int c) { - int x = min(min(a, b), c); - int z = max(max(a, b), c); + int x = min({a, b, c}); + int z = max({a, b, c}); int y = a + b + c - x - z; - if (z - x == 2) return {0, 0}; - int mx = z - x - 2; - int mi = y - x < 3 || z - y < 3 ? 1 : 2; + int mi = 0, mx = 0; + if (z - x > 2) { + mi = y - x < 3 || z - y < 3 ? 1 : 2; + mx = z - x - 2; + } return {mi, mx}; } }; \ No newline at end of file diff --git a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.go b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.go index 8976dc70a955b..4ef2845c143d4 100644 --- a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.go +++ b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.go @@ -1,14 +1,14 @@ func numMovesStones(a int, b int, c int) []int { - x := min(min(a, b), c) - z := max(max(a, b), c) + x := min(a, min(b, c)) + z := max(a, max(b, c)) y := a + b + c - x - z - if z-x == 2 { - return []int{0, 0} - } - mx := z - x - 2 - mi := 2 - if y-x < 3 || z-y < 3 { - mi = 1 + mi, mx := 0, 0 + if z-x > 2 { + mi = 2 + if y-x < 3 || z-y < 3 { + mi = 1 + } + mx = z - x - 2 } return []int{mi, mx} } diff --git a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.java b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.java index fcc3df99ad021..5f87b1e36a902 100644 --- a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.java +++ b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.java @@ -3,8 +3,11 @@ public int[] numMovesStones(int a, int b, int c) { int x = Math.min(a, Math.min(b, c)); int z = Math.max(a, Math.max(b, c)); int y = a + b + c - x - z; - int max = z - x - 2; - int min = y - x == 1 && z - y == 1 ? 0 : y - x <= 2 || z - y <= 2 ? 1 : 2; - return new int[] {min, max}; + int mi = 0, mx = 0; + if (z - x > 2) { + mi = y - x < 3 || z - y < 3 ? 1 : 2; + mx = z - x - 2; + } + return new int[]{mi, mx}; } -} +} \ No newline at end of file diff --git a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.py b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.py index 2a47bcff6546d..03794bdd771ab 100644 --- a/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.py +++ b/solution/1000-1099/1033.Moving Stones Until Consecutive/Solution.py @@ -1,12 +1,9 @@ class Solution: def numMovesStones(self, a: int, b: int, c: int) -> List[int]: - a, b, c = sorted([a, b, c]) - ans = [0] * 2 - if c - a == 2: - return ans - if b - a < 3 or c - b < 3: - ans[0] = 1 - else: - ans[0] = 2 - ans[1] = c - a - 2 - return ans + x, z = min(a, b, c), max(a, b, c) + y = a + b + c - x - z + mi = mx = 0 + if z - x > 2: + mi = 1 if y - x < 3 or z - y < 3 else 2 + mx = z - x - 2 + return [mi, mx]