牛牛和牛妹在玩一个游戏,在他们面前有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"; } };