- 博客(8)
- 收藏
- 关注
原创 归并排序算法
归并排序是一种经典的分治算法,它的基本思想是将待排序数组分成两个部分,分别对这两部分进行排序,然后将排好序的两部分合并起来,得到完全有序的数组。在 main 函数中,我们创建了一个示例数组 arr,然后调用 mergeSort 函数对其进行排序,并输出排序结果。// 计算左半部分数组的长度。// 计算右半部分数组的长度。// 递归地对左右两部分数组进行排序。// 创建临时数组来存储左右两部分数组。// 将两个有序数组合并为一个有序数组。// 合并两个有序数组。// 归并左右两部分数组。
2024-05-27 10:45:53
272
原创 礼物的最大价值,动态规划
假设有一个 m × n 的网格,每个格子中放着一个礼物,每个礼物都有一定的价值。2.对于第一行,dp[0][j] = dp[0][j-1] + grid[0][j],其中 grid[0][j] 表示第一行第 j 列格子的价值。3.对于第一列,dp[i][0] = dp[i-1][0] + grid[i][0],其中 grid[i][0] 表示第 i 行第一列格子的价值。1.对于第一行和第一列的格子,由于只能向右或向下移动,所以到达这些格子时的最大总价值等于前一个格子的最大总价值加上当前格子的价值。
2024-05-26 23:10:42
768
原创 二叉搜索树,动态规划
二叉搜索树(Binary Search Tree,BST)是一种常见的数据结构,其中每个节点最多有两个子节点,并且左子节点的值小于当前节点的值,右子节点的值大于当前节点的值。用动态规划的思想来解决这个问题,我们可以定义一个数组 dp,其中 dp[i] 表示序列长度为 (i) 时可以构建的不同BST的数量。6.dp[j - 1] * dp[i - j] 就是以当前节点 j 为根节点时,左子树BST数量乘以右子树BST数量的乘积,表示以节点 j 为根的所有可能BST的数量。// 计算不同长度下的BST数量。
2024-05-26 22:08:12
610
原创 最低票价,动态规划
在这个问题中,我们需要找出一个旅行者在一段连续的旅行中购买车票的最低总花费。假设有一段旅程,可以使用一种特定类型的车票进行旅行,这些车票可以覆盖不同的距离,并且每种车票的价格可能不同。我们可以定义一个数组 dp[] 来存储从起点到每个位置的最低总花费。然后,我们从起点开始,逐步计算每个位置的最低总花费,直到达到终点。在这个示例中,我们使用了一个大小为 n + 1 的 dp[] 数组来存储从起点到每个位置的最低总花费。然后,我们依次计算每个位置的最低总花费,并最终返回终点的最低总花费。
2024-05-26 16:41:48
348
原创 最长上升子序列,动态规划
2.我们首先初始化一个大小为 n 的数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长上升子序列的长度,初始值为 1。最长上升子序列问题是一个经典的动态规划问题,最长上升子序列是指在一个序列中,找到一个最长的子序列,使得子序列中的元素按照顺序递增。5.对于每个元素 nums[i],我们尝试找到前面的元素 nums[j](j < i),使得 nums[j] < nums[i]。这样,通过动态规划的方法,我们可以有效地找到数组中的最长上升子序列的长度。
2024-05-26 08:22:11
374
原创 动态规划,零钱兑换问题
我们首先初始化一个长度为 12 的数组 dp,其中 dp[i] 表示组成金额 i 所需的最少硬币数。16.依次类推,我们可以计算出 dp[5]、dp[6]、dp[7]、dp[8]、dp[9]、dp[10]、dp[11]。根据计算得到的 dp 数组,我们可以看到 dp[11] = 3,表示组成总金额 11 所需的最少硬币数为 3。所以,对于给定面额为 [1, 2, 5] 的硬币和总金额 11,我们需要 3 枚硬币才能凑出总金额 11。dp[0] = 0;8.使用面额为 1 的硬币,需要 1 枚硬币。
2024-05-24 17:06:25
758
原创 动态规划,打家劫舍
10.偷取第三个房屋,则偷到的金额为 4(1 + 3),因为前面没有偷取第二个房屋,不会触发警报。13.偷取第四个房屋,则偷到的金额为 4(2 + 1),因为前面偷取了第二个房屋,不会触发警报。所以,对于给定的数组 [1, 2, 3, 1],我们最多能偷取到的金额为 4。4.偷取第一个房屋,则偷到的金额为 1,因为没有相邻的房屋,不会触发警报。7.偷取第二个房屋,则偷到的金额为 2,因为没有相邻的房屋,不会触发警报。初始化时,前两个元素都为 0,因为没有房屋可偷,所以偷到的金额为 0。
2024-05-24 15:58:13
289
1
原创 动态规划,“打家劫舍“
如果偷第 i 个房屋,则最大金额为前 i-2 个房屋的最高金额加上第 i 个房屋的金额;如果不偷第 i 个房屋,则最大金额为前 i-1 个房屋的最高金额。问题描述为:给定一个非负整数数组,表示每个房屋内存放的金额,要求在不触动警报装置的情况下,计算你能够偷窃到的最高金额。这里可以使用一个一维数组来表示状态,其中 dp[i] 表示前 i 个房屋能够偷窃到的最高金额。这段代码定义了一个名为 rob 的函数,接受一个整数数组作为输入,并返回能够偷窃到的最高金额。print(rob(nums)) # 输出:12。
2024-05-24 15:50:37
349
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人