+スライディングウィンドウのルックアップテーブル

例:反復エレメントIIの存在

iおよびjが決定された配列、例えばNUMS [I] = NUMS [J 2つの異なる指標がある場合整数配列および整数kが与えられると、 ]、 iとjとの絶対値の差せいぜいのがkであると。

iそして、j最大で差の絶対値がk、その後は固定サイズを使用することができますk+1限り、このウィンドウ内の繰り返し要素があるとして、それは本当の問題、リターンの意味に沿っていることを示し、スライディングウィンドウ。あなたは完全な横断を見つけることができない場合は、falseを返します。
統計的な数いるので、あなたがセットを使用することができます。

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

1.重複要素

整数の配列を考えると、それは繰り返し要素があるか否かを判定する。

何の値が配列に二回、少なくとも表示されない場合は、関数trueを返します。配列の各要素が同じでない場合は、falseが返されます。

この比率はまた、簡単な質問、直接スライディングウィンドウが保存されている、あなたがトラバースする必要があります。

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

2.反復エレメントIIIの存在

整数配列を与え、アレイは、二つの異なる指標があるか否かを判断するiとj、その結果NUMS [i]とNUMS [J] Tの最大絶対値との差、及びiとjとの差の絶対値最大K

アイデア:バケットソート
思想のバケットソートは、例えば、第一のすべての要素のバケットに一つずつある、[0,9]、[10、19]、[20、29]、[30、39]、[40、49このように、その後、要素の同じ種類のそれぞれについて。

そして、この問題は、それが並べ替えられていないだろうが、我々は複数のサイズを構築することができt+1、デジタルスライディングウィンドウを格納するために、バレル。
毎回最初に、数字を横断し、それが置かれるべき使用するバケットを決定するために、新しいスライドウィンドウgetId()、判決後のバケット番号を取得します:

  • バケットの要素がある場合には、発見されたことを、trueを返します。
  • それは浴槽の両方近要素かどうかが決定される、それはそこをt 1に対して低減されているか否かを判断し、それが真+を返します。
  • それ以外の場合は、バケツに入れて

その後、トラバースまでは、それはfalseを返します発見していません。
各バレルは、多くても1つの要素に持つことができるので、これだけ地図にして数バレルを保存する必要があり、キーバレル番号に、値は要素のバレルの値です

public class Solution {
    // In Java, `-3 / 5 = 0` and but we need `-3 / 5 = -1`.
    private long getID(long x, long w) {
        return x < 0 ? (x + 1) / w - 1 : x / w;
    }

    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        if (t < 0) return false;
        Map<Long, Long> d = new HashMap<>();
        long w = (long)t + 1;
        for (int i = 0; i < nums.length; ++i) {
            long m = getID(nums[i], w);
            // check if bucket m is empty, each bucket may contain at most one element
            if (d.containsKey(m))
                return true;
            // check the nei***or buckets for almost duplicate
            if (d.containsKey(m - 1) && Math.abs(nums[i] - d.get(m - 1)) < w)
                return true;
            if (d.containsKey(m + 1) && Math.abs(nums[i] - d.get(m + 1)) < w)
                return true;
            // now bucket m is empty and no almost duplicate in nei***or buckets
            d.put(m, (long)nums[i]);
            //只使用一个下标便可以控制滑动窗口,学到了
            if (i >= k) d.remove(getID(nums[i - k], w));
        }
        return false;
    }
}
公開された60元の記事 ウォンの賞賛6 ビュー1201

おすすめ

転載: blog.csdn.net/DLC990319/article/details/105103622