leetcode220存在重复元素III

leetcode 220 Contains Duplicate III

Posted by BY on October 10, 2020

前言

持续更新了

正文

问题来源

本问题来自leetcode上的220题。

问题描述

在整数数组 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

分析:

func id(x, w int) int {
    if x < 0 {
        return (x + 1)/w - 1
    }
    return x / w
}

func containsNearbyAlmostDuplicate(nums []int, k int, t int) bool {
    if t < 0 {
        return false
    }
    m := make(map[int]int)
    w := t + 1
    for i := 0; i < len(nums); i++ {
        c := id(nums[i], w)
        if _, ok := m[c]; ok {
            return true
        }
        if v, ok := m[c-1]; ok && int(math.Abs(float64(nums[i] - v))) <= t {
            return true
        }
        if v, ok := m[c+1]; ok && int(math.Abs(float64(nums[i] - v))) <= t {
            return true
        }
        m[c] = nums[i]
        if i >= k {
            delete(m, id(nums[i-k], w))
        }
    }
    return false
}

总结:

勤思考。

结语

不管怎么样好好加油。