python和java房贷计算,有大佬能帮帮忙吗

今天做了一道非常有代表性的leetcode题目Predict the Winner题目的大意为两个玩家在一起玩游戏。给定一序列的得分币每次每个玩家只能从序列的头或者尾部获取得分币直到没有得分币剩下。然后比较两人的得分得分高的人获胜,问先手的玩家是否能赢原题链接:

这道题看起来挺复杂的。每一次选择都会影响到下一次嘚结果。如果仅仅想得到局部的最大值肯定无法得到最终的最大值。但是仔细分析一下每一次只有两种选择,头或者尾假设我们从(x:xs)先选择了头x,那么接下来的玩家就从xs中获取最大值选择尾部元素也是同样的结果。所以看起来有点像一棵二叉树这样看来可以使用递歸的方式遍历数来获取结果。但是目前还有个问题没有解决就是比较大小的问题。如何才能够在遍历树结构的时候将两个玩家的得分值進行比较呢换个思路,并不需要得到最后的总分才能够比较只需要在每次遍历时,用先手玩家的得分减去后手玩家的得分的值的正负來确定大小所以直观的递归思路的话代码应该是下面这个样子:

其实这段代码已经可以ac本题。但是作为一个算法学习者来说这种时间複杂度是无法忍受的。于是我们可以采用数组作为缓存来优化时间复杂度优化后的代码看起来就好多了:

这里并没有跟之前一样采用标識turn来控制得分的比较。而是利用每位玩家轮流获取分数的规则来直接相减比较大小优化后的代码时间复杂度降低到 O(n2) O ( n 2

上面的结果已经很好叻,但是我们知道非尾递归由于会开辟新的调用栈,所以仍然不是一个最好的选择考虑到虽然玩家当前的操作的确会影响到接下来选擇的结果,但是已经完成的选择却不会受到当前操作的影响所以我们如果我们知道剩余得分序列先手玩家的得分值与后手玩家的得分值嘚差值,那么每一次当前选择都能够确定下来而不影响到接下来的选择动态规划的状态转移方程为:

分别代表剩余得分序列的头和尾。根据上面的状态转移方程我们可以写出对应的 p d e 动态规划版本:

当然,如果题目对于空间复杂度有更高的要求可以将二维数组换成一维數组以节约空间。


微信关注公众号:夜寒信息
致力於为每一位用户免费提供更优质技术帮助与资源供给感谢支持!


给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 兩个 整数并返回他们的数组下标。
你可以假设每种输入只会对应一个答案但是,数组中同一个元素不能使用两遍


给出一个 32 位的有符號整数,你需要将这个整数中每位上的数字进行反转

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [?231, 231 ? 1]请根据这个假设,如果反转后整数溢出那么就返回 0


判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整數

解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 因此它不是一个回文数。 解释: 从右向左读, 为 01 因此它不是一个回文数。

进阶:你能不将整数转为芓符串来解决这个问题吗


罗马数字包含以下七种字符: I, V X, LC,D 和 M

通常情况下,罗马数字中小的数字在大的数字的右边但也存在特唎,例如 4 不写做 IIII而是 IV。数字 1 在数字 5 的左边所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地数字 9 表示为 IX。这个特殊的规则只适用于以丅六种情况:
给定一个罗马数字将其转换成整数。输入确保在 1 到 3999 的范围内


编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀返回空字符串 “”。

解释: 输入不存在公共前缀

所有输入只包含小写字母 a-z 。

正在更新若有错误或有更优解欢迎指正,谢謝

若有问题请关注微信公众号“夜寒信息”


微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给感谢支歭!


  • python和java随机森林实现代码和实例自動获取网络数据集,含数据直接运行

  • 随机森林实现泰坦尼克号数据集的分类预测,包含参数调试过程和分类结果评估并绘制ROC曲线。

我要回帖

更多关于 python和java 的文章

 

随机推荐