翻转卡片游戏
难度:
标签:
题目描述
代码结果
运行时间: 32 ms, 内存: 16.7 MB
/*
* 思路:
* 1. 使用Stream API进行数据处理。
* 2. 使用Set记录同时出现在正面和背面的数字。
* 3. 使用Stream筛选出符合条件的背面数字并找到最小值。
*/
import java.util.*;
import java.util.stream.*;
public class Solution {
public int flipgame(int[] fronts, int[] backs) {
Set<Integer> same = IntStream.range(0, fronts.length)
.filter(i -> fronts[i] == backs[i])
.mapToObj(i -> fronts[i])
.collect(Collectors.toSet());
return IntStream.concat(IntStream.of(backs), IntStream.of(fronts))
.filter(x -> !same.contains(x))
.min()
.orElse(0);
}
}
解释
方法:
这个题解的思路是先遍历一遍卡片正反面数字,将正反面数字相同的数存入一个集合 same 中。然后再分别遍历正面和反面的数字,找出不在 same 集合中的最小数字作为答案。如果最终没有找到符合条件的数字,就返回 0。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在算法实现中,为什么选择3000作为初始的最小值?这个值与输入的数字范围有何关联?
▷🦆
在遍历正面和反面数字时,是否考虑了所有卡片正反面数字都在集合`same`中的边界情况?
▷🦆
为什么算法中需要分别遍历正面和反面的数字来寻找最小值,而不是合并两者后再进行一次遍历?
▷🦆
题解中返回结果时,使用了条件`res < 3000`来判断是否找到符合条件的数字,如果输入的数字范围超过了3000怎么办?
▷