检查整数及其两倍数是否存在
难度:
标签:
题目描述
代码结果
运行时间: 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的两倍是否有特殊的处理逻辑?
▷🦆
在构建集合时,将数组中的所有元素一次性加入,这样做是否会影响判断当前元素的两倍是否已经在集合中存在?
▷🦆
如果数组中存在负数,这种方法是否仍然有效?例如,对于元素-2和-4,方法是否能正确地识别出-4是-2的两倍?
▷🦆
在算法实现中,是否考虑了数组中元素的顺序可能会影响检查结果的情况?例如,如果先遇到大数后遇到小数,解法是否还适用?
▷