递归,谁是赢家问题

这类问题可以用递归来解决。核心思想就是使用哪一种选择来使自己成功。

力扣486

决定使用哪种选择是使用max函数判断两种选择方式哪一个更棒。(min函数是对于另一个人来说的最优选择)

关键点在于抽象地使用递归这一方法。对于每次递归,我们的目的是查看哪一个更优,至于如何计算后续的结果,交给计算机即可。

自己的问题在于忘记了两个人都需要自己的每一步最优!

class Solution {
public:
    int choose(vector<int>& nums,int left,int right){
        //表示无人可选
        if (left>right)  return 0;
       //分两种情况,偶数的人选和奇数的人选,注意由于结果计算的是差值,所以奇数的人找的是最小值!
        if ((right-left)%2==0){
        return max(nums[left]+choose(nums,left+1,right),nums[right]+choose(nums,left,right-1));
        }
        else{
        return min(-nums[left]+choose(nums,left+1,right),-nums[right]+choose(nums,left,right-1));
        }
        
    }


    bool PredictTheWinner(vector<int>& nums) {
        if(nums.size()%2!=0) return choose(nums,0,nums.size()-1)>=0;
        else return choose(nums,0,nums.size()-1)<=0;
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值