LeetCode 219:反復要素IIの存在が重複IIが含まれています

トピック:

整数配列と整数所与Kが決定され、アレイ内の2つの異なるインデックスがある場合、I及びJは、例えばそのNUMS [I] = NUMS [J] およびI及びJの差の絶対値の最大値K

整数の配列と整数所与K、二つの異なる指標があるかどうかを調べるI及びJようにアレイ内NUMS [I] = NUMS [J]の絶対Iおよびjが最大であるkは

例1:

输入: nums = [1,2,3,1], k = 3
输出: true

例2:

输入: nums = [1,0,1,1], k = 1
输出: true

例3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

問題解決のアイデア:

反復は、要素Kからなるアレイのi番目の要素にサイズK、ウィンドウトラバースのスライディングウィンドウを維持nums[ i, i + K][i]が等しい要素の内側アレイとNUMSかどうかを見つけるために、

この部分の唯一のメンテナンスは、ダイナミックアレイのこの時点で検索操作の複雑さを低減する場合スライディングウィンドウを最適化することができます

方法の非常に大きな配列で時間を見つけるための複雑さの最適化:

  • ブルート:セクションKコントラスト要素が直接直後の要素を横断するポインタを操作しています
  • バイナリツリーをバランス:バランスのバイナリツリーがスライディングウィンドウを維持するために
  • ハッシュセット:長Kルック複雑のハッシュのセットを維持することは、O(1)であります

ハッシュだけが設定された秦ポリシーがスライディングウィンドウのタイムアウトを維持しません。

HashSetの問題解決:

Javaの:

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        HashSet<Integer> set=new HashSet<>();
        for(int i=0;i<nums.length;i++){
            if(set.contains(nums[i])) return true;
            set.add(nums[i]);
            if(set.size()>k) set.remove(nums[i - k]);
        }
        return false;
    }
}

Pythonの:

class Solution:
    def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
        hash_set = set()
        for i, num in enumerate(nums):
            if num in hash_set: return True
            hash_set.add(num)
            if (len(hash_set) > k): hash_set.remove(nums[i - k])

愛のバグ書き込み:マイクロ手紙ます。public .. Noにようこそ注意
私はBug.pngを書くのが大好き

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/11860995.html