diff --git a/alg.h b/alg.h new file mode 100644 index 0000000000000000000000000000000000000000..31ec4e537ce2e72aeae7f88bd3531754af621631 --- /dev/null +++ b/alg.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include +#include +using namespace std; +class Solution { +public: + vector generateParenthesis(int n) { + if (n == 0) return {}; + if (n == 1) return { "()" }; + vector> dp(n + 1); + dp[0] = { "" }; + dp[1] = { "()" }; + for (int i = 2; i <= n; i++) { + for (int j = 0; j < i; j++) { + for (string p : dp[j]) + for (string q : dp[i - j - 1]) { + string str = "(" + p + ")" + q; + dp[i].push_back(str); + } + } + } + return dp[n]; + } +}; \ No newline at end of file diff --git a/alg.md b/alg.md index 182f5f0cec5280388431ec0d87f25fbc237eb692..37733fd3fb047da3b745779c9a5ae3f02097623c 100644 --- a/alg.md +++ b/alg.md @@ -1,78 +1,135 @@ -# 三角形最小路径 +## 括号生成 -## 生成数据的思路 +### 题目描述: - rand()产生随机种子,以此产生随机数。将num[][]初始化为0,再将数组各元素替换成生成的随机数。 +数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 -```python -int num[5][5] = { 0 }; - while (num[4][4] == 0) - { - srand((int)time(0)); - for (int i = 0; i < 5; i++) - for (int j = 0; j <5; j++) + 示例 1: - { - int a = (rand() % 100) + 1; - num[i][j] = a; - } - } - cout << "生成随机三角形:" << endl; - for (int i = 0; i < 5; i++) - { - for (int j = 0; j < 5; j++) - if (i >= j) - cout << num[i][j] << ' '; - cout << endl; - } -``` +输入:n = 3 +输出:["((()))","(()())","(())()","()(())","()()()"] + +示例 2: +输入:n = 1 +输出:["()"] +### 解题思路: -## 思路 +#### 要点: -- 我们用 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和。这里的位置 (i,j) 指的是三角形中第 i 行第 j 列(均从 0 开始编号)的位置。 +​ 首先,什么是动态规划?在此题中,动态规划的思想类似于数学归纳法,当知道所有 i int: - n = len(triangle) - f = [[0] * n for _ in range(n)] - f[0][0] = triangle[0][0] +#### gen. //生成随机数 - for i in range(1, n): - f[i][0] = f[i - 1][0] + triangle[i][0] - for j in range(1, i): - f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j] - f[i][i] = f[i - 1][i - 1] + triangle[i][i] - - return min(f[n - 1]) +```c++ +#pragma once +#include +#include +#include +using namespace std; +class Ratime { + +public: + int rat() { + srand(time(nullptr)); // 用当前时间作为种子 + int min = 1, max = 3; + int randomValue; + // randomValue= (rand() % (max - min)) + min;//范围[min,max) + randomValue = (rand() % (max - min + 1)) + min;//范围[min,max] + //randomValue = (rand() % (max - min)) + min + 1;//范围(min,max] + return randomValue; + } + +}; +``` +#### alg. //生成括号 + +```c++ +#pragma once +#include +#include +#include +using namespace std; +class Solution { +public: + vector generateParenthesis(int n) { + if (n == 0) return {}; + if (n == 1) return { "()" }; + vector> dp(n + 1); + dp[0] = { "" }; + dp[1] = { "()" }; + for (int i = 2; i <= n; i++) { + for (int j = 0; j < i; j++) { + for (string p : dp[j]) + for (string q : dp[i - j - 1]) { + string str = "(" + p + ")" + q; + dp[i].push_back(str); + } + } + } + return dp[n]; + } +}; +``` +#### test.//数据测试 + +```c++ +#include"main.h"//生成括号 +#include"range.h"//生成随机数 +int main() +{ + //引用定义 + Solution example; + vector ans; + Ratime sum; + + //生成随机数 + int ram=sum.rat(); + cout << ram << endl; + + + ans=example.generateParenthesis(ram); + + //对生成的括号进行输出 + cout << "["; + for (int i = 0;i < ans.size();i++) + { + if (i != 0) + cout << ","; + cout << ans[i]; + } + cout << "]"; + return 0; +} ``` -**复杂度分析** -时间复杂度:O(n^2) -其中 n 是三角形的行数。 -空间复杂度:O(n^2) -我们需要一个 n∗n 的二维数组存放所有的状态。 +### 复杂度分析: + +​ 我们的复杂度分析依赖于理解generateParenthesis(n)中有多少个元素。这个分析超出了文本的范畴,但事实证明这是第n个卡特兰属1/n+1(2n n),这是由4^n/(n*n^(1/2))渐近界定的。 +#### 时间复杂度: +​ O(4^n/n^(1/2)),在回溯过程中,每个答案需要O(n)的时间复制到答案数组中。 -## 测试结果 +#### 空间复杂度: -![屏幕截图 2023-04-25 211755](C:\Users\崔\Pictures\Screenshots\屏幕截图 2023-04-25 211755.png) \ No newline at end of file +​ O(n),除了答案数组之外,我们所需要的空间取决于递归栈的深度,每一层递归函数都需要O(1)的空间,最多递归2n层,因此空间复杂度为O(n)。 \ No newline at end of file diff --git a/alg.py b/alg.py deleted file mode 100644 index e3b6f8f17d1922662bf61df23c5c4f014b3c3a37..0000000000000000000000000000000000000000 --- a/alg.py +++ /dev/null @@ -1,13 +0,0 @@ -class Solution: - def minimumTotal(self, triangle: List[List[int]]) -> int: - n = len(triangle) - f = [[0] * n for _ in range(n)] - f[0][0] = triangle[0][0] - - for i in range(1, n): - f[i][0] = f[i - 1][0] + triangle[i][0] - for j in range(1, i): - f[i][j] = min(f[i - 1][j - 1], f[i - 1][j]) + triangle[i][j] - f[i][i] = f[i - 1][i - 1] + triangle[i][i] - - return min(f[n - 1]) \ No newline at end of file diff --git a/gen.h b/gen.h new file mode 100644 index 0000000000000000000000000000000000000000..97b618c996d638759a83f45952be3882be0882b5 --- /dev/null +++ b/gen.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include +#include +using namespace std; +class Ratime { + +public: + int rat() { + srand(time(nullptr)); // õǰʱΪ + int min = 1, max = 3; + int randomValue; + // randomValue= (rand() % (max - min)) + min;//Χ[min,max) + randomValue = (rand() % (max - min + 1)) + min;//Χ[min,max] + //randomValue = (rand() % (max - min)) + min + 1;//Χ(min,max] + return randomValue; + } + +}; \ No newline at end of file diff --git a/gen.py b/gen.py deleted file mode 100644 index c4bca9f99ff1eeabba57c1165a6254f2c0cff992..0000000000000000000000000000000000000000 --- a/gen.py +++ /dev/null @@ -1,20 +0,0 @@ -int num[5][5] = { 0 }; - while (num[4][4] == 0) - { - srand((int)time(0)); - for (int i = 0; i < 5; i++) - for (int j = 0; j <5; j++) - - { - int a = (rand() % 100) + 1; - num[i][j] = a; - } - } - cout << "生成随机数组:" << endl; - for (int i = 0; i < 5; i++) - { - for (int j = 0; j < 5; j++) - if (i >= j) - cout << num[i][j] << ' '; - cout << endl; - } \ No newline at end of file diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..52f3fcf6e0eb6a0d942cbfbe7eb0cfbef58983a5 --- /dev/null +++ b/test.cpp @@ -0,0 +1,27 @@ +#include"main.h"// +#include"range.h"// +int main() +{ + //ö + Solution example; + vector ans; + Ratime sum; + + // + int ram=sum.rat(); + cout << ram << endl; + + + ans=example.generateParenthesis(ram); + + //ɵŽ + cout << "["; + for (int i = 0;i < ans.size();i++) + { + if (i != 0) + cout << ","; + cout << ans[i]; + } + cout << "]"; + return 0; +} \ No newline at end of file diff --git a/test.py b/test.py deleted file mode 100644 index 70a76db77fb7fe924cbbf94ea9b974e008e72a0b..0000000000000000000000000000000000000000 --- a/test.py +++ /dev/null @@ -1,6 +0,0 @@ -输入 -[[2],[3,4],[6,5,7],[4,1,8,3]] -输出 -11 -预期结果 -11 \ No newline at end of file