关闭

leetcode #220 Contains Duplicate III

标签: leetcodeBST STL multiset
384人阅读 评论(0) 收藏 举报
分类:

       通过此题了解了c++ stl中的multiset数据结构,因为使用暴力查找的方法总是超时,所以改用二叉搜索树的方法。而multiset的底层实现是基于红黑树的,满足条件。所以这里借助该数据结构进行查找。具体的是在multiset中维护一个小于等于k的二叉搜索树,当超过k的时候,删除第一个元素。然后每次在树中找大于等于 nums[i]-t 的值。lower_bound方法返回的是>=当前值得第一个迭代器。因此会有 *low >= nums[i] - t,即 nums[i]-low <= t,这里要注意,虽然差是小于t,但是有可能绝对值大于t,所以还是要判断是否满足绝对值小于t这一条件。最终算法的时间复杂度为O(nlogk)。

       另外,两个值的差有可能越界,因此此处将multiset的类型设置为long long。有兴趣的可以详细学一下multiset的官方文档,对比set。


class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        
        multiset<long long> bst;
        for (int i = 0; i < nums.size(); i++) {
            if (bst.size() == k+1)
                bst.erase(nums[i-k-1]);
            auto low = bst.lower_bound(nums[i]-t); // >= key 的第一个值
            if (low != bst.end() && abs(*low-nums[i]) <= t) // 避免差值过小为较大的负数
                return true;
            bst.insert(nums[i]);
        }
        return false;
    }
};


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5075次
    • 积分:131
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档