220.存在重复元素③

目录

题目

给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。

找出满足下述条件的下标对 (i, j):

i != j,

abs(i - j) <= indexDiff

abs(nums[i] - nums[j]) <= valueDiff

如果存在,返回 true ;否则,返回 false 。

解法

cpp 复制代码
#define LL long long
class Solution {
public:
    LL size;
    bool containsNearbyAlmostDuplicate(vector <int> & nums, int k, int t) {
        int n = nums.size();
        unordered_map<LL, LL> m;
        size = t + 1L;
        for (int i = 0; i < n; i++) {
            LL u = nums[i] * 1L;
            LL idx = getIdx(u);
            // 目标桶已存在(桶不为空),说明前面已有 [u - t, u + t] 范围的数字
            if (m.find(idx) != m.end()) return true;
            // 检查相邻的桶
            LL l = idx - 1, r = idx + 1;
            if (m.find(l) != m.end() && abs(u - m[l]) <= t) return true;
            if (m.find(r) != m.end() && abs(u - m[r]) <= t) return true;
            // 建立目标桶
            m.insert({idx, u});
            // 移除下标范围不在 [max(0, i - k), i) 内的桶
            if (i >= k) m.erase(getIdx(nums[i - k]));
        }
        return false;
    }
    LL getIdx(LL u) {
        return u >= 0 ? u / size : ((u + 1) / size) - 1;
    }
};

桶排序用于查找一个范围内的元素,这个范围就相当于桶的大小。

相关推荐
AI科技星1 天前
质量定义方程中条数概念的解析与经典例子计算
数据结构·人工智能·经验分享·算法·计算机视觉
啊阿狸不会拉杆1 天前
《数字图像处理》第8章-图像压缩和水印
图像处理·人工智能·算法·计算机视觉·数字图像处理
智航GIS1 天前
ArcGIS大师之路500技---034重采样算法选择
人工智能·算法·arcgis
子夜江寒1 天前
决策树与回归树简介:原理、实现与应用
算法·决策树·回归
TL滕1 天前
从0开始学算法——第十九天(并查集)
笔记·学习·算法
Swift社区1 天前
LeetCode 451 - 根据字符出现频率排序
算法·leetcode·ssh
JoannaJuanCV1 天前
自动驾驶—CARLA仿真(17)invertedai_traffic demo
人工智能·算法·自动驾驶·carla
浔川python社1 天前
C++小程序编写系列(2)
c++·算法·图论
合方圆~小文1 天前
四倍枪机日夜模式自动切换控制
数据结构·人工智能
LYFlied1 天前
【每日算法】LeetCode 22. 括号生成
数据结构·算法·leetcode·面试·职场和发展