看似一道简单的题目,实则不然,没有看评论的话,实在想不出来怎么写。
现在则由我来转述思想供大家参考理解,还是先给出示例,供大家更好的理解这个题目。
输入:cards = [1,2,8,9], cnt = 3
输出:18
解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。
假若cards=[2,3,1,5,8,6,9]
呢
所以我们的首要目标是先优化数组,使得数组从小到大排序Arrays.sort
即可,然后就开始分情况开始讨论了,根据cnt
的值,我们截取排序后的数组的后一段子数组,若后一段数组总和为偶数,那就说明这已经是最大的有效得分了,所以可以直接返回当前的sum,但如果是奇数,我们就又要分情况开始讨论了
如果为奇数,我们可以采取两个方式进行讨论
一个是去除掉最小的奇数换成剩余数组(总数组减去选中的子数组)中最大的偶数
一个是去除掉最小的偶数,换成剩余数组中最大的奇数
这个就是总的思路,其实并不难理解,主要是难在想到,没错就是想到…
class Solution {
public int maximumScore(int[] cards, int cnt) {
Arrays.sort(cards);
int n = cards.length;
int[] num = new int[cnt];
int sum = 0;
int mi1 = Integer.MAX_VALUE;
int mi2 = Integer.MAX_VALUE;
for(int i=0;i<cnt;i++){
num[i] = cards[n-cnt+i];
sum+=num[i];
if(num[i]%2==0){
mi2 = Math.min(mi2,num[i]);
}
else{
mi1 = Math.min(mi1,num[i]);
}
}
int mx1 = Integer.MIN_VALUE;
int mx2 = Integer.MIN_VALUE;
for(int j=0;j<n-cnt;j++){
if(cards[j]%2==0){
mx2 = Math.max(mx2,cards[j]);
}
else{
mx1 = Math.max(mx1,cards[j]);
}
}
if(sum%2==0) return sum;
else{
int option1 = 0, option2 = 0;
// 尝试用最大偶数替换当前选中的最小奇数
if (mi1 != Integer.MAX_VALUE && mx2 != Integer.MIN_VALUE) {
option1 = sum - mi1 + mx2;
}
// 尝试用最大奇数替换当前选中的最小偶数
if (mi2 != Integer.MAX_VALUE && mx1 != Integer.MIN_VALUE) {
option2 = sum - mi2 + mx1;
}
return Math.max(option1, option2);
}
}
}