leetcode
leetcode 3001 ~ 3050
心算挑战

心算挑战

难度:

标签:

题目描述

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)

代码细节讲解

🦆
为什么首先选择对卡牌进行降序排序?这对于找到最大有效得分有什么具体的帮助?
降序排序卡牌是为了确保在选择前cnt张卡牌时,我们能够拿到最大可能的数值总和。这种策略的目的是最大化初始选择的卡牌的分数,因为较大的数值卡牌通常对总得分的贡献更高。选择较大的数值可以最大化初始的总和,从而为后续可能的调整(例如通过替换卡牌来调整总和的奇偶性)提供一个较高的起点,增加达到或超过其他方案的可能性。
🦆
在没有未选择的卡牌的情况下,如果已选择的卡牌总和为奇数,为什么直接返回0而不考虑其他可能的替换方案?
如果所有卡牌都已被选择,且没有剩余的卡牌可以用于替换,那么已选择的卡牌总和若为奇数,则无法通过任何替换来改变其奇偶性。题目的要求是找到最大有效得分,而有效得分必须是偶数。由于没有额外的卡牌可以用于调整总和的奇偶性,因此这种情况下无法达成有效得分,只能返回得分为0。
🦆
在进行卡牌替换时,选择最小的偶数卡和最小的奇数卡进行替换的逻辑是基于什么考虑?是否有可能通过不同的替换策略获得更高的得分?
选择最小的偶数卡和最小的奇数卡进行替换的逻辑是基于最小化损失的原则。在需要将总和从奇数转变为偶数的情况下,替换最小的偶数卡和最小的奇数卡可以尽量减少对已有总得分的负面影响。理论上,如果有更大的偶数卡或奇数卡可用于替换,那么可能会有更优的替换策略,从而实现更高的得分。但这需要在保持总和为偶数的前提下,对所有可能的替换组合进行详细的评估,以找出能够产生最高总得分的替换方案。

相关问题