• 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
        }
    }
    
  • 相关阅读:
    (组合游戏)SG函数与SG定理详解
    第十六场快乐数学赛
    Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020
    L1-048 矩阵A乘以B (15分)
    华东交通大学2019年ACM 双基 程序设计竞赛 个人题解(A
    第十五次开心场
    L1-020 帅到没朋友 (20分)
    L1-018 大笨钟 (10分)
    Educational Codeforces Round 97 (Rated for Div. 2) (A
    [Python自学] day-6 (编程范式、类、继承)
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13774018.html
Copyright © 2020-2023  润新知