存在重复元素 III(LeetCode)

题目

给你一个整数数组 nums 和两个整数 indexDiffvalueDiff

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

  • i != j,
  • abs(i - j) <= indexDiff
  • abs(nums[i] - nums[j]) <= valueDiff

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

解题

python 复制代码
"""
该算法的时间复杂度为 O(n log min(n, indexDiff)),其中 n 是数组的长度。
SortedList 的插入和删除操作均为 O(log k),k 为当前滑动窗口的大小
"""
from sortedcontainers import SortedList


def containsNearbyAlmostDuplicate(nums, indexDiff, valueDiff):
    # 有序列表,用于维护滑动窗口内的元素
    sorted_list = SortedList()

    for i, num in enumerate(nums):
        # 如果有滑动窗口大小限制,移除不在窗口内的元素
        if i > indexDiff:
            sorted_list.remove(nums[i - indexDiff - 1])

        # 查找范围内是否存在符合条件的元素
        pos1 = sorted_list.bisect_left(num - valueDiff)
        if pos1 < len(sorted_list) and sorted_list[pos1] <= num + valueDiff:
            return True

        # 将当前元素加入有序列表中
        sorted_list.add(num)

    return False


nums = [1, 2, 3, 1]
indexDiff = 3
valueDiff = 0
print(containsNearbyAlmostDuplicate(nums, indexDiff, valueDiff))  # 输出: True
相关推荐
沐苏瑶7 小时前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
ccLianLian7 小时前
深度学习·DDPM
数据结构
ZoeJoy88 小时前
算法筑基(二):搜索算法——从线性查找到图搜索,精准定位数据
算法·哈希算法·图搜索算法
Alicx.8 小时前
dfs由易到难
算法·蓝桥杯·宽度优先
_日拱一卒8 小时前
LeetCode:找到字符串中的所有字母异位词
算法·leetcode
云泽8088 小时前
深入 AVL 树:原理剖析、旋转算法与性能评估
数据结构·c++·算法
Wilber的技术分享9 小时前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
邪神与厨二病9 小时前
Problem L. ZZUPC
c++·数学·算法·前缀和
梯度下降中11 小时前
LoRA原理精讲
人工智能·算法·机器学习
IronMurphy11 小时前
【算法三十一】46. 全排列
算法·leetcode·职场和发展