주제 :
정수 배열 정수 주어 K를 결정 배열의 두 개의 서로 다른 인덱스가있는 경우, 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, 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])
사랑 버그 쓰기 : 마이크로 편지 .. 공개 .. 아니에 오신 것을 환영합니다 관심