原题链接


两个人依次从1~maxNum中选取数字(不可重复选取同一个),累和。当一方选取数字累和后结果大于等于给定的目标数字,则此人胜利。

题目给一个maxNum和targetNum,要求判断先手能否胜利。

思路:

首先判断两种特殊条件:

  1. 可选最大值大于等于目标值,直接返回true。
  2. 其中一个人可选的最大值小于目标值,直接返回false。

具体再看题目,题目给出maxNum不大于20,则可状态压缩为一个int(32位)来保存每个数字是否被使用过(题解中利用1-32位进行存储)。

利用一个map存储选取每一个数字的情况,每一次选择前进行判断,如若已经有过选取该数字的情况,则返回map里的值。

遍历i从1到maxN,考虑选取i的情况:

判断先手胜利条件:

  1. 选上i数字后,大于等于目标值可胜利。( i >= targetN )
  2. 选上i数字后,后手输了。( helper(maxN, targetN - i, mask | visited) == false) )

    返回true。

    其他情况下,则表示先手输,返回false。

Runtime: 137 ms, faster than 43.48% of Java

class Solution {
public Map<Integer, Boolean> m = new HashMap<Integer, Boolean>(); public boolean helper(int maxN, int targetN, int visited) {
if (m.containsKey(visited))
return m.get(visited);
for (int i = 1; i <= maxN; i++) {
int mask = (1 << i);
if ((mask & visited) == 0 && (i >= targetN || helper(maxN, targetN - i, mask | visited) == false)) {
m.put(visited, true);
return true;
}
}
m.put(visited, false);
return false;
} public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
if (maxChoosableInteger >= desiredTotal)
return true;
if ((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal)
return false;
return helper(maxChoosableInteger, desiredTotal, 0);
}
}

最新文章

  1. 8-06循环结构WHILE
  2. 特许金融分析师 (CFA) 持证人现在一般在做什么工作?职业分布是怎样的?
  3. Android的常用adb命令
  4. react-native start 运行流程
  5. 21. Merge Two Sorted Lists
  6. python学习(三):matplotlib学习
  7. 【转载】alter table move 和 alter table shrink space的区别
  8. jquery 实现的一款超简单的图片切换功能
  9. gcc和g++编译c或者c++文件碰到的问题
  10. 【剑指offer】面试题35:第一个只出现一次的字符
  11. java 获取两个日期相差的毫秒数
  12. Oracle 经典SQL 专为笔试准备
  13. 30岁生日,媳妇赏的,U-BOAT手表一枚-数字尾巴
  14. 1.2 Python基本语法
  15. JavaScript基础:DOM操作详解
  16. 机器学习之支持向量机(三):核函数和KKT条件的理解
  17. java源码equals和hashCode
  18. ubuntu 主题和zsh终端
  19. Java 基础【19】代理
  20. eclipse maven项目下载jar包失败解决办法

热门文章

  1. 開發PlainTasks與JSON的插件
  2. elasticsearch.yml 常用参数说明
  3. MSB3268 .Net 4.0工程 引用BCL错误
  4. Hibernate注解(二):关联关系映射注解
  5. 揭秘重度MMORPG手游后台性能优化方案
  6. ElasticSearch2.3.1环境搭建哪些不为人知的坑
  7. Storm 学习之路(三)—— Storm单机版本环境搭建
  8. 中转Webshell 绕过安全狗(二)
  9. Thinkphp5.0之异常处理
  10. RedisCrawlSpider