目录
题目:
「力扣挑战赛」心算项目的挑战比赛中,要求选手从 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
思路:
1.先遍历数组,把奇数放在数组one中,偶数方法数组two中。
2.对one和two两个数组分别排序(这里注意,不要先对大数组排序再分奇偶,那样时间太长)(不能直接用sort排序,因为one和two这两个数组创建时长度为cards.length,后面的位置都补0了)。
3.根据cnt的奇偶性分情况:
1)cnt为0,说明以及取够了数,就结束
2)cnt为基数,说明必须要取一个偶数。
3)cnt为奇数,则先判断one和two中有没有哪个不够两个数,如果有,就直接取另一个数组中的两个数,如果都可以取,就比较这两个数组中最大的两个数的和,再取和较大的两个数。
代码:
package LiKouZhouSai;
import java.util.Arrays;
import java.util.Comparator;
public class XinSuan {
public static void main(String[] args) {
int[] a={3,1,6,9,2,4,9,2,3};
System.out.println(maxmiumScore(a,4));
}
public static int maxmiumScore(int[] cards, int cnt) {
int[] two = new int[cards.length];
int t = -1;
int[] one = new int[cards.length];
int o = -1;
int sum = 0;
//往one和two中存奇数和偶数
for (int i = 0; i < cards.length; i++) {
if (cards[i] % 2 == 0) {
two[++t] = cards[i];
} else {
one[++o] = cards[i];
}
}
if(t>0) {
Arrays.sort(two, 0, t+1);
}
if(o>0) {
Arrays.sort(one, 0, o+1);
}
while (cnt > 0) {
if (cnt % 2 != 0) {
if(t==-1){
return 0;
}
sum += two[t--];
cnt--;
}else if(o<1&&t<1){
return 0;
}
else if (o < 1) {
sum += two[t--];
sum += two[t--];
cnt-=2;
} else if (t < 1 ) {
sum += one[o--];
sum += one[o--];
cnt-=2;
}else if(two[t] + two[t - 1] >= one[o] + one[o - 1]){
sum += two[t--];
sum += two[t--];
cnt-=2;
}else if(two[t] + two[t - 1] < one[o] + one[o - 1]){
sum += one[o--];
sum += one[o--];
cnt-=2;
}
}
return sum;
}
}
结果:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/uOAnQW