863. 二叉树中所有距离为 K 的结点

算法记录

LeetCode 题目:

  在 “100 game” 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到或超过 100 的玩家,即为胜者。



说明

一、题目

  你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。

二、分析

  • 也就是一个博弈题,前一个在选完数字之后如果后一个能够成功,那也就意味着输了,说明这条路是不可选取的一个方法。
  • 在判断当前选择的数字可以赢时,便继续往下走并记录一下,防止大量的递归探测从而浪费完执行时间。
class Solution {
    private Map<Integer, Boolean> visit = new HashMap();
    public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
        if((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) return false;
        return dfs(0, maxChoosableInteger, desiredTotal);
    }
    public boolean dfs(int mask, int maxChoosableInteger, int desiredTotal) {
        if(visit.get(mask) != null) return visit.get(mask);
        for(int i = 1; i <= maxChoosableInteger; i++) {
            if((mask & (1 << i)) != 0) continue;
            if(i >= desiredTotal) return true;
            if(!dfs(mask | (1 << i), maxChoosableInteger, desiredTotal - i)) {
                visit.put(mask, true);
                return true;
            }
        }
        visit.put(mask, false);
        return false;
    }
}

总结

熟悉递归和剪枝策略。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值