您的位置:首页 > 大数据 > 人工智能

leetcode #220 Contains Duplicate III

2015-07-07 11:39 399 查看
通过此题了解了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;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: