220. 存在重复元素 III

题目描述:
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 true,不存在返回 false。

考察重点:滑动窗口,桶排序

方法概括:滑动窗口:循环i向后一位,则删除一个之前存在桶中的第i-k元素。桶排序:根据特定条件将不同元素放入不同队列中(本题中用的是hashmap)

/**
桶排序思想:以t + 1 作为桶基准来区分元素如数列 1 4 8 9 12 14 16         如果t为3 则t+1为4   bucket = n / (t+1)放入桶 0 1 2 2 3  3  4          桶只存放满足满足条件并且靠后的元素(索引2 索引3 同样在桶2,因为是向后遍历,所以存相对靠后的索引3元素即可)
*/
func ContainsNearbyAlmostDuplicate(nums []int, k int, t int) bool {numslen := len(nums)bucket := make(map[int]int, numslen)for i := 0; i < numslen; i++ {id := getId(nums[i], t)_, ok := bucket[id]if ok { //如果相同桶中有元素,直接返回return true}v, ok := bucket[id+1]if ok && abs(nums[i]-v) <= t { //如果是相邻桶中有元素,考虑有6/3=2 5/3=1这种情况  所以还需要具体比较两元素是否差值<=treturn true}v, ok = bucket[id-1]if ok && abs(nums[i]-v) <= t {return true}bucket[id] = nums[i]if i >= k { //精髓:滑动窗口,一边向后遍历,一边删除当前位置之前k位,即不满足i-j <= k的元素delete(bucket, getId(nums[i-k], t))}}return false
}func abs(n int) int {if n >= 0 {return n} else {return -n}
}func getId(n int, k int) int {if n >= 0 {return n / (k + 1)}return n/(k+1) - 1 //精髓:因为如果abs(n) < k ,比如-2 / 3 与 2 / 3 都会返回0,而负值-1则会将-2/3返回-1。由此将-2与2区分开来
} //同时因为所有负数统一-1,也不会影响其他负数。比如-4/3 将返回-2

LeetCode—220. 存在重复元素 III相关推荐

  1. leetcode 220. 存在重复元素 III(排序)

    给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) ...

  2. LeetCode 220. 存在重复元素 III(lower_bound)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间 ...

  3. Leetcode 220. 存在重复元素 III 解题思路及C++实现

    解题思路: 使用set集合来实现滑动窗口k,对窗口内的数进行比较,得到结果. 使用两个指针i.j,来确定窗口位置,i走在前面,j在后面.因为数组内这两个数的差值绝对值限制为:| x - nums[i] ...

  4. 【桶】220.存在重复元素 III 【LeetCode】

    220.存在重复元素 III [LeetCode] 给你一个整数数组 nums 和两个整数 k 和 t.请你判断是否存在 两个不同下标i和j,使得 abs(nums[i] - nums[j]) < ...

  5. leetcode 220. Contains Duplicate III | 220. 存在重复元素 III (Treeset解法+分桶解法)

    题目 https://leetcode.com/problems/contains-duplicate-iii/ 题解 方法1:Treeset 解法,滑动窗口 & 二分 思路参考:https: ...

  6. LeetCode 217. 存在重复元素(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: ...

  7. Leetcode 217. 存在重复元素 (每日一题 20210913)

    给定一个整数数组,判断是否存在重复元素.如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false .示例 1:输入: [1,2,3,1] 输出: true ...

  8. leetcode[217].存在重复元素

    给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false . 示例 1: 输入: [1,2,3,1] 输出: t ...

  9. python【力扣LeetCode算法题库】220-存在重复元素 III

    给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...

最新文章

  1. Linux 下 top 命令的使用详解
  2. 没有PARAMETER ID,想 call TRANSACTION
  3. NIO Buffer
  4. python 类和对象 有必要学吗_类与对象-python学习19
  5. 遇见未来 | 基于软件定义存储的数据加速解决方案:让你的系统加速跑
  6. Sentinel流控规则_预热_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0036
  7. android launcher推荐,追求效率的你,需要这款 Android 最快启动器:FastKey Launcher
  8. 【58沈剑架构系列】微服务架构多“微”才合适?
  9. C#连接控制西门子PLC
  10. nop掉call指令后,如何保持堆栈平衡
  11. 文科如何晋级计算机职称,职称的档次是怎么确定来的?
  12. 【愚公系列】2022年11月 uniapp专题-优购电商-个人中心页面
  13. 桌面虚拟化-精彩刚刚开始
  14. Python学习第001课--课后复习
  15. 自定义CollapsingToolbaLayout完成可收缩的带头像的Toolbar
  16. 8种开源的ETL工具
  17. Vue3 + Echarts 5 绘制带有立体感流线中国地图
  18. phi函数C语言,Intel Xeon Phi协处理器高性能编程指南 第1章.DOC
  19. Pytorch神经网络极简入门(回归)
  20. java银行安全性_Java使用同步方法解决银行取钱的安全问题案例分析

热门文章

  1. 3.AngularJS-过滤器
  2. 3ds Max Shortcuts 快捷键大全
  3. Oracle查看锁表
  4. 谁控制了我们的浏览器?
  5. 《Ext详解与实践》节选:自定义单元格的显示格式
  6. 《高效程序员的45个习惯》-之二
  7. 智能音箱 之 音频通路质量--测试与参数
  8. Match图像匹配halcon算子,持续更新
  9. 【深度学习】——纠错error: Unable to find vcvarsall.bat:关于安装pycocotools
  10. matlab——FFT傅里叶快速变换