LeetCode 0220. Contains Duplicate III Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0220. Contains Duplicate III

Description

You are given an integer array nums and two integers indexDiff and valueDiff.

Find a pair of indices (i, j) such that:

  • i != j,
  • abs(i - j) <= indexDiff.
  • abs(nums[i] - nums[j]) <= valueDiff, and

Return true if such pair exists or false otherwise.

 

Example 1:

Input: nums = [1,2,3,1], indexDiff = 3, valueDiff = 0
Output: true
Explanation: We can choose (i, j) = (0, 3).
We satisfy the three conditions:
i != j --> 0 != 3
abs(i - j) <= indexDiff --> abs(0 - 3) <= 3
abs(nums[i] - nums[j]) <= valueDiff --> abs(1 - 1) <= 0

Example 2:

Input: nums = [1,5,9,1,5,9], indexDiff = 2, valueDiff = 3
Output: false
Explanation: After trying all the possible pairs (i, j), we cannot satisfy the three conditions, so we return false.

 

Constraints:

  • 2 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • 1 <= indexDiff <= nums.length
  • 0 <= valueDiff <= 109

Solutions

Solution 1: Sliding Window + Ordered Set

We maintain a sliding window of size k, and the elements in the window are kept in order.

We traverse the array nums. For each element nums[i], we look for the first element in the ordered set that is greater than or equal to nums[i] - t. If the element exists, and this element is less than or equal to nums[i] + t, it means we have found a pair of elements that meet the conditions, and we return true. Otherwise, we insert nums[i] into the ordered set, and if the size of the ordered set exceeds k, we need to remove the earliest added element from the ordered set.

The time complexity is O(n × log k), where n is the length of the array nums. For each element, we need O(log k) time to find the element in the ordered set, and there are n elements in total, so the total time complexity is O(n × log k).

PythonJavaC++GoTypeScriptC#
class Solution: def containsNearbyAlmostDuplicate( self, nums: List[int], indexDiff: int, valueDiff: int ) -> bool: s = SortedSet() for i, v in enumerate(nums): j = s.bisect_left(v - valueDiff) if j < len(s) and s[j] <= v + valueDiff: return True s.add(v) if i >= indexDiff: s.remove(nums[i - indexDiff]) return False(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !