「力扣挑战赛」心算项目的挑战比赛中,要求选手从 N 张卡牌中选出 cnt 张卡牌,若这 cnt 张卡牌数字总和为偶数,则选手成绩「有效」且得分为 cnt 张卡牌数字总和。 给定数组 cards 和 cnt,其中 cards[i] 表示第 i 张卡牌上的数字。 请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回 0。
示例 1:
输入:
cards = [1,2,8,9], cnt = 3输出:
18解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。
示例 2:
输入:
cards = [3,3,1], cnt = 1输出:
0解释:不存在获取有效得分的卡牌方案。
提示:
1 <= cnt <= cards.length <= 10^51 <= cards[i] <= 1000
题解:
/**
* @param {number[]} cards
* @param {number} cnt
* @return {number}
*/
var maxmiumScore = function (cards, cnt) {
let ans = 0;
// 对cards进行逆序排序,为了奇、偶最大值可以展示在奇、偶数组中
cards.sort((a, b) => b - a)
// 奇数数组
const odd = [0];
// 偶数数组
let even = [0]
// 然后构造奇数和偶数前缀和数组odd, even
for (let i = 0; i < cards.length; i++) {
if (cards[i] % 2) {
odd.push(odd[odd.length - 1] + cards[i])
} else {
even.push(even[even.length - 1] + cards[i])
}
}
// 设奇数为k个 而偶数则为cut - k个
// k必须为偶数
for (let k = 0; k < odd.length; k += 2) {
// 如果偶数也符合
if (0 <= cnt - k && cnt - k < even.length) {
// console.log(k, cnt - k);
ans = Math.max(ans, odd[k] + even[cnt - k]);
}
}
return ans
};