這是我參與8月更文挑戰的第11天,活動詳情查看:8月更文挑戰算法
219. 存在重複元素 II - 力扣(LeetCode) (leetcode-cn.com)設計模式
給定一個整數數組和一個整數 k
,判斷數組中是否存在兩個不一樣的索引 i
和 j
,使得 nums [i] = nums [j],而且 i
和 j
的差的 絕對值 至多爲 k
。數組
輸入: nums = [1,2,3,1], k = 3
輸出: true
複製代碼
輸入: nums = [1,0,1,1], k = 1
輸出: true
複製代碼
輸入: nums = [1,2,3,1,2,3], k = 2
輸出: false
複製代碼
用散列表來維護一個 k
大小的滑動窗口。markdown
咱們來把題目的描述轉換下app
找到 i
和 j
,使得 nums [i] = nums [j],而且 i
和 j
的差的 絕對值 至多爲 k
。ide
⬇⬇⬇oop
在一個大小爲 k
的區間裏,看下存不存在兩個數相同。post
這個 大小爲 k
的區間 咱們有好幾種方法去實現。 這個區間咱們能夠理解爲 算法中常見的 "窗口"。動畫
假設 k =3
咱們就有一個長度爲3
的這麼一個窗口,咱們從最左邊一直往右移,去看這個窗口(框裏)有沒有相同的數字,這樣就很好理解了吧。ui
再生動點,能夠參考下這個老哥的動畫
class Solution {
fun containsNearbyDuplicate(nums: IntArray, k: Int): Boolean {
val window = mutableSetOf<Int>()
for (i in 0..nums.lastIndex) {
if (!window.add(nums[i])) {
return true
}
if(window.size > k) {
window.remove(nums[i - k])
}
}
return false
}
}
複製代碼
官方是這麼稱呼的,思路就是遍歷,而後將每一個元素與它以前的 k
個元素中比較查看它們是否相等。
代碼就略過了。
之前斷斷續續也看過一些算法書,裏面的窗口也是挺眼熟,這是在個人題解中第一次出現窗口這個字眼,其實拋開看似這麼專業的稱呼,咱們就以實際例子(窗口就是一個框,滑動就是框去套,平移)去理解就很是好理解了。
因此仍是實踐出真知,不少理論都是實踐出來的,不少模板,設計模式也都是總結抽象出來的。
存在重複元素 II - 存在重複元素 II - 力扣(LeetCode) (leetcode-cn.com)
畫解算法:219. 存在重複元素 II - 存在重複元素 II - 力扣(LeetCode) (leetcode-cn.com)