心算挑战(java 算法)
「力扣挑战赛」心算项目的挑战比赛中,要求选手从 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
解题思路在代码的注释里,非常的清晰明了,就不过多赘述了
package cn.itcast.algorithm.TTT_64; import java.util.Arrays; public class Main77 { public static void main(String[] args) { //测试用例 int[] cards = {1,2,8,9}; int cnt = 3; int result = maxmiumScore(cards,cnt); System.out.println(result); } private static int maxmiumScore(int[] cards, int cnt) { Arrays.sort(cards); int sum = 0; int qian = cards.length-1; //取最后cnt位最大的数,求和,如果是偶数就直接return while(cnt > 0){ sum += cards[qian--]; cnt--; } if (sum % 2 == 0){ return sum; } //如果不是偶数,就往下走 //利用了临近边界的数组元素的加减和sum的改变和复原 for(int i = qian;i >= 0;i--){ for(int j = qian + 1;j < cards.length;j++){ /* 因为cards是sort过的所以此时只需将进入sum的最小元素 和未进入sum中cards中的最大元素一直进行交换 */ sum -= cards[j]; sum += cards[i]; if(sum % 2 == 0){ return sum; } //如果sum不为偶数,则将sum复原为原值,进行下一轮循环的运算 sum -= cards[i]; sum += cards[j]; } } //到这里还是不存在,就return 0; return 0; } }