題解
問題描述
給定一個整數陣列 nums 和一個整數 space,我們需要找到一個目標值,使得該目標值在 nums 中的出現次數最多。如果有多個目標值出現次數相同,則返回最小的目標值。
解題思路
- 雜湊表統計:使用雜湊表 map 來統計每個 seed % space 的出現次數,題幹中給出的等式等價為
nums[n] = nums[i] + c * space
,在我們知道nums[n]的前提下,可以透過nums[n]對space取餘,來得到nums[i],c是常數,不考慮。這個過程相當於是對題乾等式的逆推。 - 遍歷陣列:再次遍歷 nums,根據雜湊表中的統計資訊來確定出現次數最多的目標值,注意這裡的key是
seed % space
。 - 更新結果:在遍歷過程中,維護一個 max 變數來記錄當前最大出現次數,並更新 result 為對應的目標值。
程式碼實現
/*
* @lc app=leetcode id=2453 lang=rust
*
* [2453] Destroy Sequential Targets
*/
// @lc code=startuse std::collections::HashMap;
impl Solution {
pub fn destroy_targets(nums: Vec<i32>, space: i32) -> i32 {
use std::collections::HashMap;
let mut map: HashMap<i32, i32> = HashMap::new();
for &seed in &nums {
let key = seed % space;
*map.entry(key).or_insert(0) += 1;
}
let mut max = 0;
let mut result = i32::MAX;
for &seed in &nums {
match map.get(&(seed % space)) {
Some(&num) => {
if num > max {
result = seed;
max = num;
} else if num == max && seed < result {
result = seed;
}
},
None => {}
}
}
return result;
}
}
// @lc code=end
程式碼中使用了 Rust 的標準庫 HashMap 來實現雜湊表,確保了高效的查詢和插入操作。透過兩次遍歷,時間複雜度為 O(n),空間複雜度為 O(k),其中 n 是陣列長度,k 是不同的 seed % space 值的數量