leetcode #220 Contains Duplicate III

       通过此题了解了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;
    }
};


阅读更多
个人分类: leetcode
上一篇leetcode#215 Kth Largest Element in an Array
下一篇leetcode #222 Count Complete Tree Nodes
想对作者说点什么? 我来说一句

leetcode solution

2018年06月07日 1.15MB 下载

leetcode java解答答案

2015年12月20日 36KB 下载

leetcode java题解

2015年08月10日 54KB 下载

leetcode经典题目全解析

2018年05月27日 1.09MB 下载

LeetCode题库答案(数据库)

2018年04月28日 416KB 下载

LeetCode java版本练习题

2017年12月06日 383KB 下载

leetcode试题的答案

2018年01月14日 101KB 下载

没有更多推荐了,返回首页

关闭
关闭