LeetCode.219 存在重複元素 II

這是我參與8月更文挑戰的第11天,活動詳情查看:8月更文挑戰算法

題目描述:

219. 存在重複元素 II - 力扣(LeetCode) (leetcode-cn.com)設計模式

給定一個整數數組和一個整數 k,判斷數組中是否存在兩個不一樣的索引 i 和 j,使得 nums [i] = nums [j],而且 ij 的差的 絕對值 至多爲 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],而且 ij 的差的 絕對值 至多爲 kide

⬇⬇⬇oop

在一個大小爲 k 的區間裏,看下存不存在兩個數相同。post

這個 大小爲 k 的區間 咱們有好幾種方法去實現。 這個區間咱們能夠理解爲 算法中常見的 "窗口"。動畫

image.png

假設 k =3 咱們就有一個長度爲3的這麼一個窗口,咱們從最左邊一直往右移,去看這個窗口(框裏)有沒有相同的數字,這樣就很好理解了吧。ui

再生動點,能夠參考下這個老哥的動畫

AC代碼

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)

相關文章
相關標籤/搜索