LeetCode--1

一:
爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:

选出任一 x,满足 0 < x < N 且 N % x == 0 。
用 N - x 替换黑板上的数字 N 。
如果玩家无法执行这些操作,就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。

输入:2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。
示例 2:

输入:3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。
public boolean divisorGame(int N) {

}

来:现在我来分析一下题目:

输入   N=  2   爱丽丝先手  输入   1    -----》(N=2-1)N=1    鲍勃入手  没法操作。。。。。爱丽丝赢了。

输入 N=  3   爱丽丝先手  输入   1    -----》(N=3-1)N=2    鲍勃入手  输入 1   (N=2-1)N=1    爱丽丝入手  没法操作。。。。。鲍勃赢了。

输入 N=  4   爱丽丝先手  输入   1    -----》(N=4-1)N=3    鲍勃入手  输入 1   (N=3-1)N=2    爱丽丝入手  输入 2/1  ,鲍勃无法入手。

数学角度:如果一直输入1 来获取胜利:那么双数一定是爱丽丝赢,单数一定是鲍勃赢

第一种解法就简单了:

 public boolean divisorGame(int N) {
      retrun N %2==0;


    }

另一个方法是动态规划:

public boolean divisorGame(int N) {
        //动态规划
        boolean[] dp = new boolean[N+1];
        //初始给定,默认全部是false;
        //【false,false ,false,false,false】;
        dp[1] = false;

        for(int i=2; i<=N; i++){

            for(int x=1; x<i; x++){
                //当第一次 i= 2;x = 1;2 % 1==0->true &&&  dp[2-1]==false-->true;====>【false,false,true ,false,false】;
                //当第二次 i= 3;x = 1; 3 % 1==0->true &&&  dp[3-1]==false--->false;====>不执行【false,false,true ,false,false】;
                //当第三次 i= 3;x = 2; 3 % 2==0->false &&&  dp[3-2]==false--->true;====>不执行;
                //当第三次 i= 4;x = 1; 4 % 1==0->true &&&  dp[4-1]==false--->true;====>执行【false,false,true,flase,true】;
                if(i % x==0 && dp[i-x]==false){
                    dp[i]=true;
                    break;
                }
            }
        }
        return dp[N];


    }

二:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 public int lengthOfLongestSubstring(String s) {
        int len = 0;
        // 窗口起始位置
        int start = 0;
        for (int cur = 1; cur < s.length(); cur++) {
            // 拿到每个当前指针元素来从窗口起始位置遍历来判断是否已存在该元素
            for (int i = start; i < cur; i++) {
                if (s.charAt(i) == s.charAt(cur)) {
                    // 存在截取长度
                    len = Math.max(len, cur - start);
                    // 窗口起始点变成出现重复第一个元素的后面
                    start = i + 1;
                    // 跳出检查
                    break;
                }
            }
        }
        // 最后比较最大长度和遍历完窗口的长度
        return Math.max(s.length() - start, len);




    }

猜你喜欢

转载自www.cnblogs.com/gtnotgod/p/13375523.html