心算挑战
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 276 ms, 内存: 26.3 MB
/*
* 题目思路:
* 使用Java Stream对数组进行过滤和处理,
* 实现计算最大有效得分的功能。
* 实现方案:
* - 使用流对数组进行组合生成和过滤。
* - 使用递归生成组合,并将其转换为流进行处理。
*/
import java.util.*;
import java.util.stream.IntStream;
public class CardGameStream {
public int maxValidScore(int[] cards, int cnt) {
return IntStream.range(0, 1 << cards.length)
.mapToObj(i -> IntStream.range(0, cards.length)
.filter(j -> (i & (1 << j)) != 0)
.map(j -> cards[j])
.toArray())
.filter(arr -> arr.length == cnt)
.mapToInt(arr -> Arrays.stream(arr).sum())
.filter(sum -> sum % 2 == 0)
.max()
.orElse(0);
}
public static void main(String[] args) {
CardGameStream game = new CardGameStream();
int[] cards = {1, 2, 8, 9};
int cnt = 3;
System.out.println(game.maxValidScore(cards, cnt)); // 输出 18
}
}
解释
方法:
这道题的思路是首先对卡牌进行降序排序,然后选择前cnt张卡牌作为初始方案。如果这些卡牌的总和是偶数,那么这就是最大有效得分。如果总和是奇数,需要找到一种方式将其转换为偶数。这可以通过替换一张卡片来实现,具体方法是:在已选择的卡牌中找到最小的偶数卡和最小的奇数卡,在未选择的卡牌中找到最大的偶数卡和最大的奇数卡。然后比较替换这些卡牌后的总和,选择一个更大的有效得分。
时间复杂度:
O(n log n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么首先选择对卡牌进行降序排序?这对于找到最大有效得分有什么具体的帮助?
▷🦆
在没有未选择的卡牌的情况下,如果已选择的卡牌总和为奇数,为什么直接返回0而不考虑其他可能的替换方案?
▷🦆
在进行卡牌替换时,选择最小的偶数卡和最小的奇数卡进行替换的逻辑是基于什么考虑?是否有可能通过不同的替换策略获得更高的得分?
▷