LeetCode 219 : 반복적 인 요소 II의 존재가 중복 II를 포함합니다

주제 :

정수 배열 정수 주어 K를 결정 배열의 두 개의 서로 다른 인덱스가있는 경우, IJ는 ,되도록 nums [I] = nums [J] , 및 IJ의 차이의 최대 절대 값 K .

정수 배열 및 정수 주어 K , 두 가지 지표가 있는지 알아 I를 하고 J 배열이되도록 nums [I] = nums [J]절대 차이 IJ는 많아야이다 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, K 요소로 이루어진 배열의 i 번째 요소 창 트래버스 슬라이딩 윈도우를 유지하고 nums[ i, i + K], 검색 할 것인지 내부 배열 및 nums [I]와 동일 요소

이 부분의 보수는, 동적 배열이 때, 검색 동작의 복잡성을 감소 여기서 슬라이딩 윈도우는 최적화 될 수있다

복잡성의 최적화 방법의 매우 큰 배열에 시간을 찾을 수 있습니다 :

  • 제 K 대비 요소는 바로 바로 다음과 같은 요소를 통과 할 포인터를 조작하고 있습니다 : 짐승을
  • 이진 트리를 균형 : 균형 이진 트리가 슬라이딩 윈도우를 유지하는
  • 해시 세트 : 길이 K 보면 복잡 해시들의 세트를 유지하는 O (1)

단지 해시 세트 진 정책은 슬라이딩 윈도우 시간 제한을 유지하지 않습니다

HashSet의 문제 해결 :

자바 :

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;
    }
}

파이썬 :

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])

사랑 버그 쓰기 : 마이크로 편지 .. 공개 .. 아니에 오신 것을 환영합니다 관심
나는 Bug.png를 작성하는 사랑

추천

출처www.cnblogs.com/zhangzhe532/p/11860995.html