leetcodeには重複要素III(java)が存在する

6303 ワード

整数配列が与えられ、nums[i]とnums[j]の差の絶対値が最大tとなり、iとjの差の絶対値が最大tとなるように、配列に2つの異なるインデックスiとjがあるか否かが判断される.ķ.
例1:
入力:nums=[1,2,3,1],k=3,t=0出力:true例2:
入力:nums=[1,0,1,1],k=1,t=2出力:true例3:
入力:nums=[1,5,9,1,5,9],k=2,t=3出力:false
2回読んでやっと題意を理解して、つまり、配列の中で2つの異なる要素を探して、2人の数値の差はtにならないで、2人の配列の中のシーケンス番号の差はkにならないで暴力の循環を除いて、大物たちの構想を見て、全体は与えられた下のスケールの差の上限kで1つの“ウィンドウ”を設置して、それから配列を遍歴して、遍歴した数とウィンドウの中で比較して、えっ条件を満たす数が出たらtrue出力です.見つからない場合は、現在の数をウィンドウに入れ、ウィンドウが超過している場合は、最初にウィンドウの数のように削除すると、ウィンドウが配列の中で右に1つ移動し、常に下のスケール差が境界を越えないようにします.
class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        if(nums.length==0||k==0)return false;
        Set<Integer> set= new HashSet<>();
            
        for(int i=0;i<nums.length;i++){
        //    ,         ,    ,      ,      。。。
            if(t==0){
                if(set.contains(nums[i])){
                    return true;
                }
            }else{
                for(int num:set){
                    if(Math.abs((long)nums[i]-(long)num)<=t){
                        return true;
                    }
                }
            }
        set.add(nums[i]);
        if(set.size()>k){
            set.remove(nums[i-k]);
        }
        }
        return false;
    }
}