diff --git "a/279\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.png" "b/279\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..6b01e2bd2a3cfc1ce474efe5357685ded31d93bd Binary files /dev/null and "b/279\345\256\214\345\205\250\345\271\263\346\226\271\346\225\260.png" differ diff --git a/KN6[01N)I2@QL]F9}U1A8JW.png b/KN6[01N)I2@QL]F9}U1A8JW.png deleted file mode 100644 index afa4c43b83976f98894684728186dd13ee5bf831..0000000000000000000000000000000000000000 Binary files a/KN6[01N)I2@QL]F9}U1A8JW.png and /dev/null differ diff --git a/alg.md b/alg.md new file mode 100644 index 0000000000000000000000000000000000000000..036f97a5e096b82d513ddfb0b3009edb3a5e80b3 --- /dev/null +++ b/alg.md @@ -0,0 +1,90 @@ +# 解题报告:完全平方数 + +## 题目描述 + +给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 + +完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 + + + +## 思路分析 + +该算法使用动态规划的思想,具体思路如下dp[i]的值为和为 i 的完全平方数的最少数量,我们从1开始一直算到n,每次dp[i]等于所有能再加一个完全平方数等于i的值中的最小值,dp中最后一个元素就是我们要寻找的和为 n 的完全平方数的最少数量。 + +1. 定义状态:dp[i]表示数字i最少可以由几个完全平方数的和组成。 +2. 初始化状态:dp[0] = 0,其余dp[i]均为正无穷。 +3. 状态转移方程:对于数字i,遍历每个小于等于i的完全平方数j*j,将dp[i-j*j]+1与dp[i]取最小值。 +4. 返回结果:dp[n]为数字n最少可以由几个完全平方数的和组成。 + +## 数据测试 + +为了测试算法的鲁棒性,我们需要生成一些随机的数据进行测试。生成数据的思路如下: + +1. 生成一个随机数n,表示数字n需要分解为完全平方数的和。 +2. 为了保证算法的正确性,n的范围应该从1到较大的数,例如1000。 +3. 返回一个包含n的元组,作为算法的输入数据。 + +## 时间复杂度分析 + +O(n*sqrt(n))。外层循环遍历n个数字,内层循环遍历每个数字的平方根,因此总的时间复杂度为O(n*sqrt(n))。 + +空间复杂度:O(n)。需要使用一个长度为n+1的数组来存储状态。 + +## 代码实现 + +```python +from random import randint +def generate_data(): + n = randint(1, 1000) + return (n,) +from typing import List +class Solution: + def numSquares(self, n: int) -> int: + # 初始化dp数组 + dp = [float("inf")] * (n + 1) + dp[0] = 0 + # 遍历每个数 + for i in range(1, n + 1): + # 遍历每个完全平方数 + for j in range(1, int(i ** 0.5) + 1): + dp[i] = min(dp[i], dp[i - j*j] + 1) + return dp[n] +def generate_data(): + n = randint(1, 1000) + return (n,) + +``` + +## 测试示例 + +​ 下面是一个测试代码的例子: + +```python +def test(): + s = Solution() + for i in range(10): + n = i * 100 + res = s.numSquares(n) + print(f"For n = {n}, the minimum number of perfect squares is {res}") +if __name__ == "__main__": + test() +``` + + + +![](C:\Users\XUZIY\Desktop\279完全平方数.png) + +## 心得体会 + +git用起来没有第一次那么坎坷,基本的操作都没有问题,也在不断地用一些新东西。这次实验,我在不断加深对动态规划问题的理解。 + +## 实验环境 + +win10 + +python3.11 + +jupyter notebook + +git. \ No newline at end of file diff --git a/alg.py b/alg.py new file mode 100644 index 0000000000000000000000000000000000000000..af2aed327f505ca8ff06164d68cd3843b00706bf --- /dev/null +++ b/alg.py @@ -0,0 +1,12 @@ +from typing import List +class Solution: + def numSquares(self, n: int) -> int: + # 初始化dp数组 + dp = [float("inf")] * (n + 1) + dp[0] = 0 + # 遍历每个数 + for i in range(1, n + 1): + # 遍历每个完全平方数 + for j in range(1, int(i ** 0.5) + 1): + dp[i] = min(dp[i], dp[i - j*j] + 1) + return dp[n] \ No newline at end of file diff --git a/dp.cpp b/dp.cpp deleted file mode 100644 index 49fabe21677760d20a60b6d4f4d5379bcf5bb966..0000000000000000000000000000000000000000 --- a/dp.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -using namespace std; - -#define maxn 10010 -int dp[maxn];////dp[i]A[i]Ϊβе - -void maxSubArray(vector& num) -{ - dp[0] = num[0]; - int ans[] = { 0 }; - for (int i = 1; i < num.size(); i++)//״̬תƷ - { - dp[i] = max(num[i], dp[i - 1] + num[i]); - } - //к - int k = dp[0]; - for (int i = 1; i < num.size(); i++) - { - if (dp[i] > k) - k = dp[i]; - } - cout << "the maxsubsum=" << k << endl; -} -int main() -{ - vector arr = { -2,1,-3,4,-1,2,1,-5,4 }; - for (int i = 1; i < arr.size(); i++) - { - cout << arr[i]<<" "; - } - cout << endl; - maxSubArray(arr); -} \ No newline at end of file diff --git a/gen.py b/gen.py new file mode 100644 index 0000000000000000000000000000000000000000..1c16f48d7f6b44ce2ec650a8a22ff7dadd368a72 --- /dev/null +++ b/gen.py @@ -0,0 +1,4 @@ +nums = [3,2,1,6,0,5] + + + diff --git a/test.py b/test.py new file mode 100644 index 0000000000000000000000000000000000000000..3af305458bceaa91bf31e34600e040086adbadbe --- /dev/null +++ b/test.py @@ -0,0 +1,19 @@ +import gen +import alg + +n = gen.nums +root = alg.constructMaximumBinaryTree(n) +# 前序遍历二叉树 +def preorderTraversal(root): + res = [] + def helper(root): + # 如果树为空,则返回None + if not root: + return None + res.append(root.val) + helper(root.left) + helper(root.right) + helper(root) + return res +# 输出遍历结果 +print(preorderTraversal(root)) diff --git "a/\347\256\227\346\263\225\350\256\276\350\256\241\345\210\206\346\236\220s=\345\256\236\351\252\214\344\270\211.md" "b/\347\256\227\346\263\225\350\256\276\350\256\241\345\210\206\346\236\220s=\345\256\236\351\252\214\344\270\211.md" deleted file mode 100644 index 7407a2d4ccb62b44111da4f590a331fb4b34f604..0000000000000000000000000000000000000000 --- "a/\347\256\227\346\263\225\350\256\276\350\256\241\345\210\206\346\236\220s=\345\256\236\351\252\214\344\270\211.md" +++ /dev/null @@ -1,82 +0,0 @@ -# 算法设计分析 - -### 求最大子序列和 - -###### 1.算法实现及测试 - -```c++ -#include -#include -using namespace std; - -#define maxn 10010 -int dp[maxn];////dp[i]存放以A[i]为结尾的连续序列的最大和 - -void maxSubArray(vector& num) -{ - dp[0] = num[0]; - int ans[] = { 0 }; - for (int i = 1; i < num.size(); i++)//状态转移方程 - { - dp[i] = max(num[i], dp[i - 1] + num[i]); - } - //求最大连续子序列和 - int k = dp[0]; - for (int i = 1; i < num.size(); i++) - { - if (dp[i] > k) - k = dp[i]; - } - cout << "the maxsubsum=" << k << endl; -} -int main() -{ - vector arr = { -2,1,-3,4,-1,2,1,-5,4 }; - for (int i = 1; i < arr.size(); i++) - { - cout << arr[i]<<" "; - } - cout << endl; - maxSubArray(arr); -} -``` - -*思路*: - - 步骤 1:令状态 dp[i] 表示以 A[i] 作为末尾的连续序列的最大和(这里是说 A[i] 必须作为连续序列的末尾)。 - -步骤 2:做如下考虑:因为 dp[i] 要求是必须以 A[i] 结尾的连续序列,那么只有两种情况:(1)这个最大和的连续序列只有一个元素,即以 A[i] 开始,以 A[i] 结尾。(2) 这个最大和的连续序列有多个元素,即从前面某处 A[p] 开始 (p