开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 34 天,点击查看活动详情
问题描述
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
更正式地,检查是否存在两个下标 i 和 j 满足:
i != j0 <= i, j < arr.lengtharr[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
思路分析
首先我们要先理解一下题目的意思,题目会给我们一个数组,我们要判断数组中是否存在两个整数:下标为i的N 和 下标为j的M,满足以下条件:
i != j0 <= i, j < arr.lengtharr[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;
};
说在后面
本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。