leetcode
leetcode 1251 ~ 1300
检查整数及其两倍数是否存在

检查整数及其两倍数是否存在

难度:

标签:

题目描述

代码结果

运行时间: 24 ms, 内存: 16.6 MB


/*
 * Solution using Java Streams
 * We use streams to iterate through the array and apply similar logic as the traditional Java solution.
 * The use of `anyMatch` helps to find if any pair meets the criteria where N = 2 * M.
 */
import java.util.HashSet;
import java.util.Set;
import java.util.stream.IntStream;

public class SolutionStream {
    public boolean checkIfExist(int[] arr) {
        Set<Integer> seen = new HashSet<>();
        return IntStream.of(arr).anyMatch(num -> {
            if (seen.contains(num * 2) || (num % 2 == 0 && seen.contains(num / 2))) {
                return true;
            }
            seen.add(num);
            return false;
        });
    }
}

解释

方法:

这个解法利用一个集合来记录数组中的所有元素,以实现快速查找。首先,将数组中的所有元素添加到集合中。然后遍历数组,对于每个元素,如果是0,检查是否已经遇到过0(因为0的两倍还是0),如果是,则返回true。对于非0元素,检查集合中是否存在其两倍的数,如果存在,则返回true。如果整个数组遍历完成后都没有找到符合条件的元素对,最后返回false。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么在处理0的情况时,只有在第二次遇到0才返回true?在集合中查找0的两倍是否有特殊的处理逻辑?
在处理0的情况时,只有在第二次遇到0才返回true,是因为0的两倍还是0。如果数组中只有一个0,那么它没有另一个0与之配对,因此不满足题目的条件。只有当至少有两个0时,这两个0才能形成有效的 '整数及其两倍数' 对。在集合中查找0的两倍并没有特殊的处理逻辑,但需要确保集合中至少有两个0才可以返回true。
🦆
在构建集合时,将数组中的所有元素一次性加入,这样做是否会影响判断当前元素的两倍是否已经在集合中存在?
将数组中的所有元素一次性加入集合并不影响判断当前元素的两倍是否已经在集合中存在。这种方法可以保证在检查某个元素时,集合中已经包含所有数组元素,从而可以快速判断任何元素的两倍数是否存在于集合中。这种处理方式简化了逻辑并优化了查找速度。
🦆
如果数组中存在负数,这种方法是否仍然有效?例如,对于元素-2和-4,方法是否能正确地识别出-4是-2的两倍?
是的,这种方法仍然有效,即使数组中存在负数。对于负数,两倍关系仍然成立,例如,-4确实是-2的两倍。因为集合中包含了所有元素,所以无论是正数还是负数,只要存在某个数的两倍数,无论其正负,都可以通过在集合中查找来正确识别。
🦆
在算法实现中,是否考虑了数组中元素的顺序可能会影响检查结果的情况?例如,如果先遇到大数后遇到小数,解法是否还适用?
在这种算法实现中,元素的顺序不会影响检查结果。因为在开始遍历前,所有数组元素都已经被添加到集合中,这意味着无论何时遍历到某个元素,集合里已经包含了所有其他的元素。因此,无论是先遇到大数还是小数,只要集合中存在某个数的两倍,都可以立即检测到。这确保了算法的正确性不受元素顺序的影响。

相关问题