Contains Duplicate II LT219

Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k.

Example 1:

Input: nums = [1,2,3,1], k = 3
Output: true

Example 2:

Input: nums = [1,0,1,1], k = 1
Output: true

Example 3:

Input: nums = [1,2,3,1,2,3], k = 2
Output: false

Idea 1. Sliding window + HashMap(Set), note there are k+1 values in the window for [0, k].

Time complexity: O(N)

Space complexity: O(k+1)

 1 class Solution {
 2     public boolean containsNearbyDuplicate(int[] nums, int k) {
 3         Set<Integer> cache = new HashSet<>();
 4         
 5         for(int right = 0; right < nums.length; ++right) {
 6             if(right >= k+1) {
 7                 cache.remove(nums[right - (k+1)]);
 8             }
 9             
10             if(cache.contains(nums[right])) {
11                 return true;
12             }
13             cache.add(nums[right]);
14         }
15         
16         return false;
17     }
18 }

Idea 1.b HashMap with index, pair (nums[i], i), 

Time complexity: O(N)

Space complexity: O(N)

 1 class Solution {
 2     public boolean containsNearbyDuplicate(int[] nums, int k) {
 3         Map<Integer, Integer> cache = new HashMap<>();
 4         
 5         for(int i = 0; i < nums.length; ++i) {
 6             Integer prev = cache.get(nums[i]);
 7             if(prev != null && i - prev <= k) {
 8                 return true;
 9             }
10             cache.put(nums[i], i);
11         }
12         
13         return false;
14     }
15 }
 

posted on 2019-05-12 04:52  一直走在路上  阅读(192)  评论(0编辑  收藏  举报

导航