牛牛和牛妹在玩一个游戏,在他们面前有n个数,牛妹每次说出一个数m,牛牛就要从这些数中找到m个数使它们的和刚好为奇数(这是游戏胜利的条件),不能够做到的话则牛牛输掉游戏。
牛牛特别想赢得游戏,所以他想请你帮忙,给定n个数和m,如果牛牛能够赢得游戏,返回"YES",反之,返回"NO"。

题解:首先,我们要明确以下几点:
奇数 + 奇数 = 偶数
奇数 + 偶数 = 奇数
偶数 + 偶数 = 偶数
那么我们便可以利用这个性质,先统计奇数的数量和偶数的数量,根据以上性质,要有奇数个数量的奇数,才能使其和为奇数,我们也可以发现,偶数对最终的求和是没有影响的,那么我们就可以开始从小到大的遍历奇数,然后用m去减去这些奇数,就些数就是需要用偶数去补充的,偶数能够补充的话,结果也是满足的。
时间复杂度:图片说明
空间复杂度:图片说明
代码如下:

class Solution {
public:
    /**
     * 如果牛牛能够赢得游戏,返回"YES",反之,返回"NO"。
     * @param n int整型 代表共有n个数
     * @param m int整型 代表牛妹说的数m
     * @param a int整型vector 代表这n个数的大小
     * @return string字符串
     */
    string solve(int n, int m, vector<int> &a)
    {
        int _odd = 0, _even = 0;
        for (int i = 1; i <= n; ++i)
        {
            if (a[i - 1] & 1)
                ++_odd;
            else
                ++_even;
        }
        for (int i = 1; i <= _odd; i += 2)
        {
            int u = m - i;
            if (u <= _even && u >= 0)
            {
                return "YES";
            }
        }
        return "NO";
    }
};