zoukankan      html  css  js  c++  java
  • can-i-win(好)

    https://leetcode.com/problems/can-i-win/

    package com.company;
    
    
    import java.util.*;
    
    class Solution {
    
        // 参考了下面的解法:
        // https://discuss.leetcode.com/topic/68773/java-solution
        // 开始没有用dp,超时了
        // discuss里面解法太牛逼了,用位图来作为key记录
        // 用Boolean而不是boolean来做数组,可以充分利用null的初始值
        // 其中 ^= 异或也用的非常好,非常到位,返回的时候也很好
    
        Boolean[] gotList;
        int m;
        int key;
    
        public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
            if ((1+maxChoosableInteger)*maxChoosableInteger < desiredTotal) {
                return false;
            }
    
            m = maxChoosableInteger;
            key = 0;
            gotList = new Boolean[1 << m];
            return win(desiredTotal);
    
        }
    
        private boolean win(int d) {
            if (gotList[key] != null) {
                return gotList[key];
            }
            for (int i=0; i<m; i++) {
                int bit = 1 << i;
                if ((key & bit) == 0) {
                    if (i+1 >= d) {
                        gotList[key] = true;
                        return true;
                    }
    
                    key ^= bit;
                    boolean tmp = false;
                    if (!win(d-i-1)) {
                        tmp = true;
                    }
                    key ^= bit;
                    if (tmp) {
                        gotList[key] = true;
                        return true;
                    }
                }
            }
            gotList[key] = false;
            return false;
        }
    
    }
    
    public class Main {
    
        public static void main(String[] args) throws InterruptedException {
    
            System.out.println("Hello!");
            Solution solution = new Solution();
    
            // Your Codec object will be instantiated and called as such:
            int maxChoosableInteger = 18;
            int desiredTotal = 79;
            boolean ret = solution.canIWin(maxChoosableInteger, desiredTotal);
            System.out.printf("ret:%b
    ", ret);
    
            System.out.println();
    
        }
    
    }
  • 相关阅读:
    C puzzles详解【51-57题】
    C puzzles详解【46-50题】
    C puzzles详解【38-45题】
    C puzzles详解【34-37题】
    C puzzles详解【31-33题】
    C puzzles详解【26-30题】
    C puzzles详解【21-25题】
    C puzzles详解【16-20题】
    使用C++模板实现栈的求最小值功能
    模拟求幂运算,考虑的已经很周全了
  • 原文地址:https://www.cnblogs.com/charlesblc/p/6087555.html
Copyright © 2011-2022 走看看