LeetCode刷题——猜数字大小II#375#Medium

本文探讨了LeetCode中猜数字大小II的问题,该问题涉及数学和动态规划。作者提供了Java实现的记忆化搜索方法和Python实现的动态规划方法。尽管Java版本表现出色,Python版本仍有提升空间,期待更多优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

猜数字大小II的思路探讨与源码
    猜数字大小II的题目如下图,该题属于数学类和动态规划类型的题目,主要考察对于动态规划方法的使用和题目数学思路的理解。本文的题目作者想到2种方法,分别是记忆化搜索方法和动态规划方法,其中记忆化搜索方法使用Java进行编写,而动态规划方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用记忆化搜索方法的思路进行解决,首先初始化参数,然后定义一个循环递归函数,在函数内部实现的逻辑如下:传入下限和上限参数,判断下限参数是否大于等于上限参数,如果是则直接返回0并结束,判断当前位置的对应的数组值是否不为0,如果是则直接返回数组当前结果。开始遍历循环,找出附近元素的最大值,然后比较历史值和附近元素最大值的大小,保存更小的那个值,直到循环遍历结束并保存历史最小值到当前元素值。以此逻辑递归搜索直到结束并最终返回结果。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    static int N = 210;
    static int[][] arr = new int[N][N];
    public int getMoneyAmount(int n) {
        return searchDFS(1, n);
    }
    int searchDFS(int a, int b) {
        if (a >= b){
            return 0;
        }
        if(arr[a][b] != 0){
            return arr[a][b];
        }
        int res = 0x3f3f3f3f;
        for (int jr = a; jr <= b; jr++) {
            int ind = Math.max(searchDFS(a,jr-1), searchDFS(jr+1,b))+jr;
            res = Math.min(res,ind);
        }
        arr[a][b] = res;
        return res;
    }
}

在这里插入图片描述
    显然,我们的记忆化搜索方法的效果还不错,还可以使用动态规划方法解决。首先初始化一个动态规划数组并进行赋值,然后开始进行遍历,将动态规划的每个值都等于下标与左边的值的求和,然后在区域内部,按该题的动态规划的转移方程的规则进行比较并赋值,直到循环结束并返回最终结果。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution:
    def getMoneyAmount(self, n: int) -> int:
        dpArr = [[0] * (n + 1) for _ in range(n + 1)]
        for ir in range(n - 1, 0, -1):
            for jr in range(ir + 1, n + 1):
                dpArr[ir][jr] = jr + dpArr[ir][jr - 1]
                for kr in range (ir, jr):
                    dpArr[ir][jr] = min(dpArr[ir][jr], kr + max(dpArr[ir][kr-1],dpArr[kr+1][jr]))
        return dpArr[1][n]

在这里插入图片描述
    从结果来说Java版本记忆化搜索方法的效率不错,而Python版本的动态规划方法的速度比较一般,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值