# LeetCode Easy 219. Contains Duplicate II
tags: leetcode
問題
アイデア
「k
という整数と整数の配列を与えられたとき,i-j=k
かつnums[i]==nums[j]
となるようなi
とj
となるものがあるかどうかを探す」問題です.
解法
- 連想配列を用意します.(
map[num[index]] = index
) 0 <= i < nums.len()
となるようなi
を走査します.- そして,
map.get(num[i])
を取得します(つまり,nums[i]
に対応した添字j
.- 取得できないときは,
map.insert(nums[i], i)
とします.
- 取得できないときは,
- できたときは,
i - j <= k
となれば,これは求める数字があるということです.
- そして,
- 全て調べて無理な時は
false
です.
計算量
配列の大きさを$N$とします.
- 時間計算量
- $O(N)$
- 空間計算量
- $O(N)$
Rust
use std::collections::HashMap; impl Solution { pub fn contains_nearby_duplicate(nums: Vec<i32>, k: i32) -> bool { let k = k as usize; let mut map = HashMap::new(); for i in 0..nums.len() { if let Some(j) = map.get((&nums[i])) { if i - j <= k { return true; } } map.insert(nums[i], i); } false } }