LeetCode—220. 存在重复元素 III
生活随笔
收集整理的這篇文章主要介紹了
LeetCode—220. 存在重复元素 III
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Windows XP下,安装VS 20
- 下一篇: I2C 总线协议详解