zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    HDU1398Square Coins(母函数)
    HDU2079选课时间(母函数)
    HDU1028Ignatius and the Princess III(母函数)
    POJ1061青蛙的约会(扩展欧几里得)
    POJ1189钉子和小球(DP)
    POJ1179Polygon(DP)
    POJ2001Shortest Prefixes(字典树)
    POJ1157 LITTLE SHOP OF FLOWERS
    POJ3630Phone List(字典树)
    亲和串(HDU2203)
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/9539687.html
Copyright © 2011-2022 走看看