插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
坚持不懈,越努力越幸运,大家一起学习鸭~~~
3妹:2哥,听说武汉某高校有霍乱,霍乱是什么啊?
2哥:霍乱是因摄入的食物或水受到霍乱弧菌污染而引起的一种急性腹泻性传染病。每年,估计有300万~500万霍乱病例,另有10万~12万人死亡。病发高峰期在夏季,能在数小时内造成腹泻脱水甚至死亡。
3妹:啊, 这么严重。
2哥:不要恐慌,目前武汉也只有一例,并且这个病的死亡核概率还是很小的。
3妹:那怎样避免霍乱呢?
2哥:普通人,要做到勤洗手,吃熟食, 不吃生的东西,不要去不干净的路边摊吃东西。
3妹:啊, 我还想去路边吃烧烤呢,看来还是算了吧。
2哥:3妹就知道吃,还是在家好好学习吧。
题目:
「力扣挑战赛」心算项目的挑战比赛中,要求选手从 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^5
1 <= cards[i] <= 1000
#思路:
分析思路见代码
java代码:
class Solution {
public int maxmiumScore(int[] cards, int cnt) {
// 排序
Arrays.sort(cards);
// 对cnt=1的情况单独处理
if (cnt == 1) {
for (int i = cards.length-1; i >= 0; i--) {
if (cards[i]%2 == 0) return cards[i];
}
return 0;
}
int sum = 0;
// 获取倒数cnt个数
int i = cards.length-1;
for (; i >= cards.length-cnt; i--) {
sum += cards[i];
}
// 如果和为偶数直接返回
if (sum % 2 == 0) return sum;
// i < 0表示cnt == cards.length,即只有一种选择
if (i < 0) return 0;
// 分析可知n个数的和(sum)为奇数,则n个数里一定存在奇数和偶数
// 获取倒数cnt+1数的奇偶性:true为偶数,false为奇数
boolean flag = cards[i] % 2 == 0;
// 从倒数cnt数开始,向后遍历,寻找和(倒数cnt+1数)奇偶不同差值最小的数
int index = i+1;
while (index < cards.length && (flag == (cards[index]%2==0))) {
index++;
}
// 找到后用倒数cnt+1数替换此数,如 5 7 9 14,cnt = 2, sum = 23 + 7 - 14 = 16
return sum + cards[i] - cards[index];
}
}