给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。
玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。
如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 。你可以假设每个玩家的玩法都会使他的分数最大化。
| Level | AC rate |
| Medium | 59.2% |
两个人取数,每个人在当前回合都会取对自己利益最大的数,不管是眼前的利益,或者是之后的利益,当只剩下一个数的时候,便没得选,只能取这个数,当剩下两个数的时候则一人取一个即可,假设我们是其中的一个玩家,当剩下最后两个数的时候会怎么选,肯定选最大那个数,然后我们判断剩下四个数的时候,我们先算是取左边的数利益最大,还是右边的数利益最大,我们就取于我们而言利益最大的数即可,而我们的对手会把利益最小的一个选择留给我们,用递归的方式可以求得我能够取得的最大数之和,用所有数之和减去我的分数,即为对手的分数,通过比较可以判断输赢。
// 递归
class Solution {
public boolean PredictTheWinner(int[] nums) {
int sum = 0;
for(int i = 0; i<nums.length; i++){
sum += nums[i];
}
int player1 = max_score(nums,0,nums.length-1);
return player1>=(sum-player1);
}
int max_score(int[] arr, int l , int r){
int left_score = 0;
int right_score = 0;
if(l==r)return arr[l];
if(r-l==1){
left_score = arr[l];
right_score = arr[r];
}
if(r-l>1){
left_score = arr[l] + Math.min(max_score(arr, l+2, r),max_score(arr, l+1, r-1));
right_score = arr[r] + Math.min(max_score(arr, l, r-2),max_score(arr, l+1, r-1));
}
return Math.max(left_score, right_score);
}
}
注意我们max_score函数中,当l==r时也就是只剩下一个数的时候,你就把数取走即可,当剩下两个数的时候,你取走最大的一个数,当所剩下的数大于一个数的时候,假设你取左边那个数,那么对手也有两个取法,他会选择导致你分数最少的那个取法,因为分数是一定的,你的分数越少,他的分数就越多。同理,若你取右边那个数,对手也有两个取法。然后返回你一开始取左边能够得到的最大分数和一开始取右边能够得到的最大分数中的较大值返回即可。
执行用时:27 ms, 在所有 Java 提交中击败了26.71%的用户
内存消耗:39.1 MB, 在所有 Java 提交中击败了26.14%的用户
在递归的基础上可以进行进一步的优化,我们可以根据两个取法的差值最优化来实现,比如我第一个取左边的数,那我们的分数插值就是左边的数减去你从剩下数里操作能够领先我多少分,右侧同理。代码如下:
int max_score(int[] arr, int l , int r){
if(l==r)return arr[l];
int left_score = arr[l] - max_score(arr,l+1,r);
int right_score = arr[r] - max_score(arr,l,r-1);
return Math.max(left_score, right_score);
}
能够减少递归次数。在递归优化的基础上我们提出动态规划,如果我们可以使用一个数组将每次递归的值存储起来,再要使用的时候直接调用的话,是不是能够实现更低的时间复杂度,这里有两个值,l,r,我们使用一个二维数组,将不同l,r值对应的最大分数存储进去,用代码解释,代码如下:
// 动态规划
class Solution {
public boolean PredictTheWinner(int[] nums) {
return dp(nums);
}
boolean dp(int[] arr){
int len = arr.length;
int[][] minus = new int[len][len];
for(int i = 0 ; i<len ; i++){
minus[i][i] = arr[i];
}
for(int l = len-2; l>=0 ; l--){
for(int r = l+1; r<len ; r++){
minus[l][r] = Math.max(arr[l]-minus[l+1][r],arr[r]-minus[l][r-1]);
}
}
return minus[0][len-1]>=0;
}
}
首先还是相同的判断当只剩一个数的时候,将对应矩阵中的数初始化为该数,然后l往左移,r往右移,选每次的最优解即取左还是取右,填入二维数组中(注意,这里填入的是每一轮的差值),最后返回l在开头,r在末尾的值,即为最优值,若大于等于0,则胜。
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.8 MB, 在所有 Java 提交中击败了72.89%的用户
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我有一个随机大小的散列,它可能有类似"100"的值,我想将其转换为整数。我知道我可以使用value.to_iifvalue.to_i.to_s==value来做到这一点,但我不确定我将如何在我的散列中递归地做到这一点,考虑到一个值可以是一个字符串,或一个数组(哈希或字符串),或另一个哈希。 最佳答案 这是一个非常简单的递归实现(尽管必须同时处理数组和散列会增加一些技巧)。deffixnumifyobjifobj.respond_to?:to_i#IfwecancastittoaFixnum,doit.obj.to_ielsifobj
首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟
我经常迷上ruby的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情
我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
如何在对象上调用方法名称的嵌套哈希?例如,给定以下哈希:hash={:a=>{:b=>{:c=>:d}}}我想创建一个方法,给定上面的散列,执行以下操作:object.send(:a).send(:b).send(:c).send(:d)我的想法是我需要从一个未知的关联中获取一个特定的属性(这个方法不知道,但程序员知道)。我希望能够指定一个方法链来以嵌套哈希的形式检索该属性。例如:hash={:manufacturer=>{:addresses=>{:first=>:postal_code}}}car.execute_method_hash(hash)=>90210
我有一个ruby程序,我想接受用户创建的方法,并使用该名称创建一个新方法。我试过这个:defmethod_missing(meth,*args,&block)name=meth.to_sclass我收到以下错误:`define_method':interningemptystring(ArgumentError)in'method_missing'有什么想法吗?谢谢。编辑:我以不同的方式让它工作,但我仍然很好奇如何以这种方式做到这一点。这是我的代码:defmethod_missing(meth,*args,&block)Adder.class_evaldodefine_method
假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入