1. 程式人生 > >LeetCode220 存在重複元素 III

LeetCode220 存在重複元素 III

給定一個整數陣列,判斷陣列中是否有兩個不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的絕對值最大為 t,並且 i 和 j 之間的差的絕對值最大為 ķ

示例 1:

輸入: nums = [1,2,3,1], k= 3, t = 0
輸出: true

示例 2:

輸入: nums = [1,0,1,1], k=1, t = 2
輸出: true

示例 3:

輸入: nums = [1,5,9,1,5,9], k = 2, t = 3
輸出: false




/*
演算法思想:
    emmm...這道題不會先copy著0.0
    我們使用map資料結構來解,用來記錄數字和其下標之間的對映。 這裡需要兩個指標i和j,剛開始i和j都指向0,然後i開始向右走遍歷陣列,如果i和j之差大於k,且m中有nums[j],則刪除並j加一。這樣保證了m中所有的數的下標之差都不大於k,然後我們用map資料結構的lower_bound()函式來找一個特定範圍,就是大於或等於nums[i] - t的地方,所有小於這個閾值的數和nums[i]的差的絕對值會大於t (可自行帶數檢驗)。然後檢測後面的所有的數字,如果數的差的絕對值小於等於t,則返回true。最後遍歷完整個陣列返回false。
*/ //演算法實現: class Solution { public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { map<long long, int> m; int j = 0; for (int i = 0; i < nums.size(); ++i) { if (i - j > k) m.erase(nums[j++]); auto a
= m.lower_bound((long long)nums[i] - t); if (a != m.end() && abs(a->first - nums[i]) <= t) return true; m[nums[i]] = i; } return false; } };