https://leetcode.com/problems/find-the-duplicate-number/
1~n
までの各数字の登場回数をバリューに保存して 2 以上になっているものを特定する方法で実装した。
use std::collections::HashMap;
impl Solution {
pub fn find_duplicate(nums: Vec<i32>) -> i32 {
let mut nums_count = HashMap::new();
for num in nums {
nums_count.entry(num).and_modify(|count| *count += 1).or_insert(1);
}
*nums_count.iter().filter(|(k, v)| *v > &1).next().unwrap().0
}
}
なんとか二分探索で計算量節約できないかなと思ったら Solution の一つにあった。
impl Solution {
pub fn find_duplicate(nums: Vec<i32>) -> i32 {
let mut l = 0;
let mut r = nums.len() as i32;
let mut dup = -1;
while l < r {
let m = l + (r - l) / 2;
let mut count = 0;
for num in &nums {
if *num <= m {
count += 1;
}
}
if count > m {
dup = m;
r = m;
} else {
l = m + 1;
}
}
dup
}
}