給定整數陣列 nums,判斷是否存在 i ≠ j 使得 |nums[i]-nums[j]| ≤ t 且 |i-j| ≤ k。
k 的窗口,保證下標差 ≤ k。[x-t, x+t] 範圍內」→ 有序容器。multiset(紅黑樹)支援 lower_bound、插入、刪除均 O(log k)。i = 0..n-1。i > k,從窗口刪除 nums[i-k-1]。lower_bound(nums[i] - t),若迭代器有效且 *it - nums[i] ≤ t → 返回 true。nums[i] 進窗口。false。class Solution {
public:
bool containsNearbyAlmostDuplicate(vector& nums, int k, int t) {
if (k < 1) return false;
multiset window; // 用 long long 防溢位
for (int i = 0; i < (int)nums.size(); ++i) {
if (i > k) window.erase(window.find(nums[i - k - 1]));
auto it = window.lower_bound((long long)nums[i] - t);
if (it != window.end() && *it - nums[i] <= t) return true;
window.insert(nums[i]);
}
return false;
}
};
O(n log k)。O(k)。t 可能為 0,lower_bound(x) 正確處理等值情況。nums[i] - t 可能溢位 int,轉 long long。window.erase(val) 會刪除所有等值元素,必須用 window.find(val) 刪除單一實例。k=0 直接 false(題目要求 i≠j)。unordered_set O(n)。k,unordered_map O(n)。t 且下標差 ≤ k,需有序統計結構。