leetcode刷题笔记 220题 存在重复元素 III

leetcode刷题笔记 220题 存在重复元素 III

源地址:220. 存在重复元素 III

问题描述:

在整数数组 nums 中,是否存在两个下标 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 ķ 。

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

示例 1:

输入: nums = [1,2,3,1], k = 3, t = 0
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1, t = 2
输出: true
示例 3:

输入: nums = [1,5,9,1,5,9], k = 2, t = 3
输出: false

//使用TreeSet管理k个节点, TreeSet使用TreeMap构造,底层原理也是红黑树
import scala.collection.mutable
object Solution {
    def containsNearbyAlmostDuplicate(nums: Array[Int], k: Int, t: Int): Boolean = {
        val set = new mutable.TreeSet[Long]()
        
        for (i <- 0 to nums.length-1) {
            val maxBefore = set.maxBefore(nums(i).toLong)
            if (maxBefore != None && maxBefore.get + t >= nums(i)) return true
            
            val minAfter = set.minAfter(nums(i).toLong)
            if (minAfter != None && minAfter.get <= nums(i) + t) return true
            
            set.add(nums(i))
            if (set.size > k) set.remove(nums(i-k))
        }
        
        return false
    }
}

//以t长度进行分桶,每个数所在的桶及相邻的桶中判断是否满足条件
//维护K个节点的映射关系
import scala.collection.mutable
object Solution {
    def containsNearbyAlmostDuplicate(nums: Array[Int], k: Int, t: Int): Boolean = {
        if (k <= 0 || t < 0) return false
        
        def getId(i: Int): Int = {
            if (i >= 0) return i / (t+1)
            else return i / (t+1) - 1
        }
        
        val bucket = mutable.HashMap[Int, Int]()
        
        for (i <- 0 to nums.length-1) {
            val elem = nums(i)
            val bucketId = getId(elem)
            
            //位于桶内或者相邻桶
            if (bucket.contains(bucketId)) return true
            if (bucket.contains(bucketId-1) && (elem.toLong - bucket(bucketId -1).toLong <= t)) return true
            if (bucket.contains(bucketId+1) && (bucket(bucketId+1).toLong - elem.toLong <= t)) return true
            
            //控制桶内个数
            if (i >= k) {
                val last = getId(nums(i - k))
                bucket.remove(last)
            }
            bucket.put(bucketId, elem)
        }
        
        return false
    }
}
posted @ 2020-10-06 17:53  ganshuoos  阅读(155)  评论(0编辑  收藏  举报