From a8fe372c1ac51be3646efcb19821beadaa9cad17 Mon Sep 17 00:00:00 2001 From: xin-lingjian <1849002928@qq.com> Date: Wed, 26 Apr 2023 16:08:28 +0800 Subject: [PATCH] first --- alg.h | 25 +++++++++ alg.md | 159 +++++++++++++++++++++++++++++++++++++------------------ alg.py | 13 ----- gen.h | 19 +++++++ gen.py | 20 ------- test.cpp | 27 ++++++++++ test.py | 6 --- 7 files changed, 179 insertions(+), 90 deletions(-) create mode 100644 alg.h delete mode 100644 alg.py create mode 100644 gen.h delete mode 100644 gen.py create mode 100644 test.cpp delete mode 100644 test.py diff --git a/alg.h b/alg.h new file mode 100644 index 0000000..31ec4e5 --- /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 182f5f0..37733fd 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 e3b6f8f..0000000 --- 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 0000000..97b618c --- /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 c4bca9f..0000000 --- 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 0000000..52f3fcf --- /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 70a76db..0000000 --- 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 -- Gitee