1. 程式人生 > >查詢表類演算法//存在重複元素 III

查詢表類演算法//存在重複元素 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
class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        set<long> ss;
        long It = t;
        for(int i = 0; i < nums.size(); i++){
            if(i > k) ss.erase(nums[i-k-1]);
            set<long>::iterator it = ss.lower_bound(nums[i]-It);
            if(it != ss.end()&&(*it)-nums[i]<=It) return true;
            ss.insert(nums[i]);
        }
        return false;
    }
};

C++中set的用法

set的特性是,所有元素都會根據元素的鍵值自動排序,set的元素不像map那樣可以同時擁有實值(value)和鍵值(key),set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素有相同的鍵值。

set的各成員函式列表如下:

1. begin()--返回指向第一個元素的迭代器

2. clear()--清除所有元素

3. count()--返回某個值元素的個數

4. empty()--如果集合為空,返回true

5. end()--返回指向最後一個元素的迭代器

6. equal_range()--返回集合中與給定值相等的上下限的兩個迭代器

7. erase()--刪除集合中的元素

8. find()--返回一個指向被查詢到元素的迭代器

9. get_allocator()--返回集合的分配器

10. insert()--在集合中插入元素

11. lower_bound()--返回指向大於(或等於)某值的第一個元素的迭代器

12. key_comp()--返回一個用於元素間值比較的函式

13. max_size()--返回集合能容納的元素的最大限值

14. rbegin()--返回指向集合中最後一個元素的反向迭代器

15. rend()--返回指向集合中第一個元素的反向迭代器

16. size()--集合中元素的數目

17. swap()--交換兩個集合變數

18. upper_bound()--返回大於某個值元素的迭代器

19. value_comp()--返回一個用於比較元素間的值的函式