其他分享
首页 > 其他分享> > leetcode 石子游戏 IX

leetcode 石子游戏 IX

作者:互联网

题目链接
思路:分析+举例
分析:首先,看懂题目规则,谁选完后,已经被选了的数目被3整除,谁就输了,并且都选完,还是不能被3整除,先手也输了。
这里要注意的是,输赢和总数究竟是多少无关,而与这个总数是不是3的倍数有关,所以stones数组中的每个数究竟是多少我们不用管,而需要关心的是,每个数模3是多少,并且这里和顺序无关,所以我们要统计一下这个数组中,除3的余数是0、1、2的分别有多少个,所以可以弄一个数组arr[i]:表示除3的余数是i的个数。
其次,我们举几个例子找找规律,首先有很无数个除3余数是1、2的,先不考虑整除3的。
A和B两人
A :1
B : 1
A : 2
B : 1
A : 2
B: 1

也就是 1 1 2 1 2 1
如果先手要赢,那么2的个数不能比1少

当然,也可以是这样
A :2
B : 2
A : 1
B : 2
A : 1
B: 2

如果先手要赢,那么1的个数不能比2少

如下图
在这里插入图片描述
中间可以有很多2----1
但是最后,如果先手要赢,必须得是后手也只能选2这种情况。
上面两种情况可以总结为:如果1和2得个数都不为0,那么先手必赢,当然这里是没有3的倍数的情况下。
我们还可以考虑一下,如果1或者2的个数为0,那么先手肯定是输的。
如果有3的倍数的情况下,我们可以考虑一下,如果有偶数个,那么上面的情况是不会变的,因为先手不先选3的倍数,如果后手选了,先手再选3的倍数,那么就相当于两个人都没选。
所以如果有3的倍数,且个数是偶数个,那么上面情况没变。
也就是说,3的倍数的个数是偶数个,并且1和2的个数都不为0个,那么谁遇到谁就赢。

如果有3的倍数,且个数是奇数个。这种情况先手要赢,我们举例看看。

在这里插入图片描述

如果先手要赢,那么必须是类似于上面这种情况,也就是有一种数字,必须比另一种数字多至少3个。
代码:

class Solution {
    public boolean stoneGameIX(int[] stones) {
    	//记录余数是  0  1  2的个数
        int[] arr = new int[3];
        for(int i : stones){
        	//记录个数
            arr[i%3]++;
        }
        //如果3的倍数是偶数个
        if((arr[0]&1)==0){
        	//那么只要1和2的个数都不为0就赢了
            return arr[2] >= 1 && arr[1] >= 1;
        }
        //如果3的倍数是奇数个,并且1和2的个数相差超过2,那么就赢了
        return Math.abs(arr[2]-arr[1])>2;
    }
}

这个题最好自己手动模拟一下是最好理解的了。

好好学习。
不打扰是我的温柔。

标签:IX,arr,那么,石子,个数,先手,倍数,如果,leetcode
来源: https://blog.csdn.net/weixin_42496727/article/details/122715519