From 2ff1ab1660e216a4f387d969e28ff5968bde42b7 Mon Sep 17 00:00:00 2001 From: AnghelLeonard Date: Thu, 27 Feb 2020 08:08:03 +0200 Subject: [PATCH] Count distincts in every sub-array --- Chapter10/CountDistinctInSubarray/pom.xml | 14 +++++ .../main/java/coding/challenge/Arrays.java | 58 +++++++++++++++++++ .../src/main/java/coding/challenge/Main.java | 14 +++++ 3 files changed, 86 insertions(+) create mode 100644 Chapter10/CountDistinctInSubarray/pom.xml create mode 100644 Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Arrays.java create mode 100644 Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Main.java diff --git a/Chapter10/CountDistinctInSubarray/pom.xml b/Chapter10/CountDistinctInSubarray/pom.xml new file mode 100644 index 00000000..0b653dab --- /dev/null +++ b/Chapter10/CountDistinctInSubarray/pom.xml @@ -0,0 +1,14 @@ + + + 4.0.0 + coding.challenge + CountDistinctInSubarray + 1.0 + jar + + UTF-8 + 13 + 13 + + CountDistinctInSubarray + \ No newline at end of file diff --git a/Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Arrays.java b/Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Arrays.java new file mode 100644 index 00000000..b9e61360 --- /dev/null +++ b/Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Arrays.java @@ -0,0 +1,58 @@ +package coding.challenge; + +import java.util.HashMap; +import java.util.Map; + +public final class Arrays { + + private Arrays() { + throw new AssertionError("Cannot be instantiated"); + } + + public static void find(int[] m, int n) { + + if (m == null) { + throw new IllegalArgumentException("The given array cannot be null"); + } + + if (n <= 0) { + throw new IllegalArgumentException("The given sub-array size cannot be <= 0"); + } + + // store frequency of elements in current window of size n + Map frequency = new HashMap<>(); + + // count distinct elements in every sub-array of size n + int countDistinct = 0; + + for (int i = 0; i < m.length; i++) { + + // skip first n elements + if (i >= n) { + // Remove first element from the sub-array + frequency.putIfAbsent(m[i - n], 0); + frequency.put(m[i - n], frequency.get(m[i - n]) - 1); + + // reduce distinct count if we are left with 0 + if (frequency.get(m[i - n]) == 0) { + countDistinct--; + } + } + + // add current element to the sub-array + frequency.putIfAbsent(m[i], 0); + frequency.put(m[i], frequency.get(m[i]) + 1); + + // element is for the first time in current window? + if (frequency.get(m[i]) == 1) { + countDistinct++; + } + + if (i >= n - 1) { + System.out.println("Distinct elements in the " + + "sub-array [" + (i - n + 1) + ", " + i + "]" + " is " + + countDistinct); + } + } + } +} diff --git a/Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Main.java b/Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Main.java new file mode 100644 index 00000000..8ee63eec --- /dev/null +++ b/Chapter10/CountDistinctInSubarray/src/main/java/coding/challenge/Main.java @@ -0,0 +1,14 @@ +package coding.challenge; + +public class Main { + + public static void main(String[] args) { + + int[] m = {7, 11, 11, -5, 13, 13, 13, 15, -4, -3, -4, 15, -2, 0, 0, 0, 14, 3, 7, 42, 3}; + int k = 5; + + System.out.println("Array: " + java.util.Arrays.toString(m)); + + Arrays.find(m, k); + } +}