leetcode
leetcode 1301 ~ 1350
找出数组中的幸运数

找出数组中的幸运数

难度:

标签:

题目描述

代码结果

运行时间: 23 ms, 内存: 16.0 MB


/*
 * Solution approach using Java Streams:
 * 1. Create a frequency map using the stream's collect method and a counting collector.
 * 2. Use the entrySet stream to filter entries where the key equals the value (lucky number condition).
 * 3. Use the max operation to find the largest lucky number, or return -1 if none exist.
 */
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class LuckyNumberStream {
    public int findLucky(int[] arr) {
        Map<Integer, Long> frequencyMap = IntStream.of(arr)
                .boxed()
                .collect(Collectors.groupingBy(num -> num, Collectors.counting()));
        return frequencyMap.entrySet().stream()
                .filter(entry -> entry.getKey().equals(entry.getValue().intValue()))
                .map(Map.Entry::getKey)
                .max(Integer::compare)
                .orElse(-1);
    }
}

解释

方法:

该题解首先使用Counter来统计数组arr中各元素的出现频次,得到一个哈希表。然后,通过一个lambda表达式,检查哈希表中的每个元素(数值)和其对应的频次是否相等。如果相等,则保留该数值,否则返回-1。最后通过max函数从可能的幸运数中选择最大的一个。如果没有找到任何幸运数,max函数将返回-1。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在这个题解中,为什么选择使用Counter来统计元素频次,而不是其他数据结构如字典或数组?
在Python中,Counter是collections模块提供的一个专门的类,用于计数可哈希对象。它本质上是一个字典,其中对象作为键,对象的计数作为值。使用Counter而不是普通字典的优势在于Counter提供了直接的方法和语法来进行元素计数,使代码更简洁、易读,并且减少了手动处理计数逻辑的错误。虽然可以使用普通字典来达到同样的目的,但使用Counter可以使代码更专注于问题的解决而非细节实现。此外,Counter还自动处理了如果元素不存在时开始计数的情况,省去了初始化步骤。
🦆
题解中提到的lambda函数是否有效处理了所有键和值的匹配,特别是当键的顺序与值的顺序不一致时?
题解中的lambda函数通过zip函数直接将Counter对象的keys()和values()相结合,确保了键和值是一一对应的。在Python中,Counter的keys()和values()方法返回的顺序是匹配的,因为它们都基于同一个内部字典结构。因此,lambda函数能有效处理键和值的匹配,即使在键和值的顺序是如何的情况下也能保证一一对应。
🦆
解法中如果遇到没有任何幸运数的情况,max函数如何确保返回-1而不是抛出异常?
在Python中,如果max函数的输入是一个空的可迭代对象,它会抛出ValueError异常。然而,在这个题解中,通过在map函数内使用了条件表达式,即使没有元素满足条件(元素值与出现频次相等),map函数仍会返回-1。这确保了传递给max函数的迭代器至少包含一个-1,因此max函数在这种情况下会返回-1而不是抛出异常。
🦆
在题解的逻辑中,有没有可能出现错误或遗漏,例如处理数组中所有元素都相同的特殊情况?
题解的逻辑针对数组中所有元素都相同的情况也能正确处理。因为如果数组中的所有元素都相同,则它们的出现频次与元素值相同,满足幸运数的定义。在这种情况下,Counter将只有一个键值对,其中键是那个重复的元素,值是其出现的频次。lambda函数将检查这个键值对,如果键(元素值)与值(频次)相等,则它将被认为是幸运数。因此,这种情况也被逻辑正确处理,并不会有遗漏。

相关问题