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

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 34 天,点击查看活动详情

问题描述

给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。

更正式地,检查是否存在两个下标 i 和 j 满足:

  • i != j
  • 0 <= i, j < arr.length
  • arr[i] == 2 * arr[j]

示例 1:

输入: arr = [10,2,5,3]
输出: true
解释: N = 10 是 M = 5 的两倍,即 10 = 2 * 5

示例 2:

输入: arr = [7,1,14,11]
输出: true
解释: N = 14 是 M = 7 的两倍,即 14 = 2 * 7

示例 3:

输入: arr = [3,1,7,11]
输出: false
解释: 在该情况下不存在 N 和 M 满足 N = 2 * M 。

提示:

  • 2 <= arr.length <= 500
  • -10^3 <= arr[i] <= 10^3

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个数组,我们要判断数组中是否存在两个整数:下标为iN 和 下标为jM,满足以下条件:

  • i != j
  • 0 <= i, j < arr.length
  • arr[i] == 2 * arr[j]

我们可以使用哈希表来记录每个出现过的整数,在遍历的过程中判断当前元素作为N时,哈希表中是否有符合条件的M,或者当前元素作为M时,哈希表中是否有符合条件的N

  • 1、遍历数组
for(const i of arr){
    ……
}
  • 2、判断当前元素是否为零

判断当前元素是否为零,为零时判断前面是否出现过另一个零。

for(const i of arr){
    if(i == 0 && map[i]) return true;
    ……
}
  • 3、判断当前元素是否有有另一个元素可以与其组合

使用哈希表记录当前元素,并判断当前元素作为N时,哈希表中是否有符合条件的M,或者当前元素作为M时,哈希表中是否有符合条件的N

for(const i of arr){
    ……
    map[i] = true;
    if(i != 0 && (map[i * 2] || (i % 2 == 0 && map[i / 2]))) return true;
}

AC 代码

完整代码如下:

/**
 * @param {number[]} arr
 * @return {boolean}
 */
var checkIfExist = function(arr) {
    const map = {};
    for(const i of arr){
        if(i == 0 && map[i]) return true;
        map[i] = true;
        if(i != 0 && (map[i * 2] || (i % 2 == 0 && map[i / 2]))) return true;
    }
    return false;
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。