【leetcode】220 ContainsDuplicate3

题目说明

https://leetcode-cn.com/problems/contains-duplicate-iii/description/
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。

解法1

对于位置之差保存在k以内,使用set维护一个不大于k的窗口,在数组内进行遍历。
第一层循环指定窗口的右边界,对于新进入窗口的元素num[i],需要判断窗口内是否有元素x可以满足|num[i] - x| <= t即 num[i] - t <= x <= t + nums[i]。
使用lower_bound来找到第一个满足num[i] - t条件的位置。然后判断是否满足 x <= t + nums[i]。
如果都满足则说明有索引满足条件,返回true;如果不满足,则将该元素加入set,继续下一个元素的判断。

/*
 * 时间复杂度:O(nlogn)
 * 使用multiset来保存值,用其当作滑动的窗口,若set长度大于k,则移除前面的数据,始终保持k的大小
 */
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
    if (nums.size() == 0 )
        return false;
    multiset<long long> set1;
    for (int i = 0; i < nums.size(); i ++){
        if (i > k)
            set1.erase(set1.find(nums[i - k - 1]));
        //|num[i] - x| <= t即 num[i] - t <= x <= t + nums[i]
        //lower_bound表示找到set1中第一个不小于参数中值的位置
        //注意:使用long long 64位整型,因为使用int有可能溢出
        auto iter = set1.lower_bound((long long)nums[i] - (long long)t);
        if (iter != set1.end() && *iter - (long long)nums[i] <= (long long)t)
            return true;
        set1.insert(nums[i]);
    }
    return false;
}
posted @ 2018-08-27 00:35  JESSET  阅读(364)  评论(0编辑  收藏  举报