From ee39ec40190e84535451f9eeb4ff8e0b84f450a9 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 07:59:46 +0700 Subject: [PATCH 01/13] added tasks 350, 352, 354 --- .../Solution.java | 28 ++++++++++ .../readme.md | 30 +++++++++++ .../SummaryRanges.java | 54 +++++++++++++++++++ .../readme.md | 26 +++++++++ .../Solution.java | 34 ++++++++++++ .../s0354_russian_doll_envelopes/readme.md | 31 +++++++++++ .../SolutionTest.java | 22 ++++++++ .../SolutionTest.java | 52 ++++++++++++++++++ .../SolutionTest.java | 21 ++++++++ 9 files changed, 298 insertions(+) create mode 100644 src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java create mode 100644 src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/readme.md create mode 100644 src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java create mode 100644 src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md create mode 100644 src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java create mode 100644 src/main/java/g0301_0400/s0354_russian_doll_envelopes/readme.md create mode 100644 src/test/java/g0301_0400/s0350_intersection_of_two_arrays_ii/SolutionTest.java create mode 100644 src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java create mode 100644 src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java new file mode 100644 index 000000000..d46e5cc05 --- /dev/null +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -0,0 +1,28 @@ +package g0301_0400.s0350_intersection_of_two_arrays_ii; + +// #Easy #Top_Interview_Questions #Array #Hash_Table #Sorting #Binary_Search #Two_Pointers + +import java.util.Arrays; + +public class Solution { + public int[] intersect(int[] nums1, int[] nums2) { + Arrays.sort(nums1); + Arrays.sort(nums2); + + int i = 0; + int j = 0; + int k = 0; + + while (i < nums1.length && j < nums2.length) { + if (nums1[i] < nums2[j]) { + i++; + } else if (nums1[i]> nums2[j]) { + j++; + } else { + nums1[k++] = nums1[i++]; + j++; + } + } + return Arrays.copyOfRange(nums1, 0, k); + } +} diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/readme.md b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/readme.md new file mode 100644 index 000000000..94b2942aa --- /dev/null +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/readme.md @@ -0,0 +1,30 @@ +350\. Intersection of Two Arrays II + +Easy + +Given two integer arrays `nums1` and `nums2`, return _an array of their intersection_. Each element in the result must appear as many times as it shows in both arrays and you may return the result in **any order**. + +**Example 1:** + +**Input:** nums1 = \[1,2,2,1\], nums2 = \[2,2\] + +**Output:** \[2,2\] + +**Example 2:** + +**Input:** nums1 = \[4,9,5\], nums2 = \[9,4,9,8,4\] + +**Output:** \[4,9\] + +**Explanation:** \[9,4\] is also accepted. + +**Constraints:** + +* `1 <= nums1.length, nums2.length <= 1000` +* `0 <= nums1[i], nums2[i] <= 1000` + +**Follow up:** + +* What if the given array is already sorted? How would you optimize your algorithm? +* What if `nums1`'s size is small compared to `nums2`'s size? Which algorithm is better? +* What if elements of `nums2` are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once? \ No newline at end of file diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java new file mode 100644 index 000000000..2654ad4e0 --- /dev/null +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java @@ -0,0 +1,54 @@ +package g0301_0400.s0352_data_stream_as_disjoint_intervals; + +// #Hard #Binary_Search #Design #Ordered_Set + +import java.util.*; + +public class SummaryRanges { + + private final NavigableSet intervals; + private final Set seen = new HashSet(); + + public SummaryRanges() { + this.intervals = new TreeSet(Comparator.comparingInt(i -> i[0])); + } + + public void addNum(int val) { + if (seen.contains(val)) { + return; + } + seen.add(val); + int[] interval = new int[] {val, val}; + this.intervals.add(interval); + this.merge(interval); + } + + public int[][] getIntervals() { + int[][] res = new int[intervals.size()][2]; + int i = 0; + for (int[] in : intervals) { + res[i] = in; + i++; + } + return res; + } + + private void merge(int[] interval) { + // base case + if (interval == null) { + return; + } + int[] lower = intervals.lower(interval); + + int[] higher; + + if (lower != null && lower[1] == interval[0] - 1) { + lower[1] = interval[1]; + intervals.remove(interval); + higher = intervals.higher(lower); + } else { + higher = intervals.higher(interval); + } + merge(higher); + } +} diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md new file mode 100644 index 000000000..72f8d13f7 --- /dev/null +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md @@ -0,0 +1,26 @@ +352\. Data Stream as Disjoint Intervals + +Hard + +Given a data stream input of non-negative integers a1, a2, ..., an, summarize the numbers seen so far as a list of disjoint intervals. + +Implement the `SummaryRanges` class: + +* `SummaryRanges()` Initializes the object with an empty stream. +* `void addNum(int val)` Adds the integer `val` to the stream. +* `int[][] getIntervals()` Returns a summary of the integers in the stream currently as a list of disjoint intervals [starti, endi]. + +**Example 1:** + +**Input** \["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"\] \[\[\], \[1\], \[\], \[3\], \[\], \[7\], \[\], \[2\], \[\], \[6\], \[\]\] + +**Output:** \[null, null, \[\[1, 1\]\], null, \[\[1, 1\], \[3, 3\]\], null, \[\[1, 1\], \[3, 3\], \[7, 7\]\], null, \[\[1, 3\], \[7, 7\]\], null, \[\[1, 3\], \[6, 7\]\]\] + +**Explanation:** SummaryRanges summaryRanges = new SummaryRanges(); summaryRanges.addNum(1); // arr = \[1\] summaryRanges.getIntervals(); // return \[\[1, 1\]\] summaryRanges.addNum(3); // arr = \[1, 3\] summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\]\] summaryRanges.addNum(7); // arr = \[1, 3, 7\] summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\], \[7, 7\]\] summaryRanges.addNum(2); // arr = \[1, 2, 3, 7\] summaryRanges.getIntervals(); // return \[\[1, 3\], \[7, 7\]\] summaryRanges.addNum(6); // arr = \[1, 2, 3, 6, 7\] summaryRanges.getIntervals(); // return \[\[1, 3\], \[6, 7\]\] + +**Constraints:** + +* 0 <= val <= 104 +* At most 3 * 104 calls will be made to `addNum` and `getIntervals`. + +**Follow up:** What if there are lots of merges and the number of disjoint intervals is small compared to the size of the data stream? \ No newline at end of file diff --git a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java new file mode 100644 index 000000000..22bdf6390 --- /dev/null +++ b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java @@ -0,0 +1,34 @@ +package g0301_0400.s0354_russian_doll_envelopes; + +// #Hard #Array #Dynamic_Programming #Sorting #Binary_Search + +import java.util.Arrays; + +public class Solution { + public int maxEnvelopes(int[][] envelopes) { + Arrays.sort(envelopes, (a, b) -> a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]); + + int[] tails = new int[envelopes.length]; + int size = 0; + + for (int[] enve : envelopes) { + int i = 0, j = size; + + while (i != j) { + int mid = i + ((j - i)>> 1); + + if (tails[mid] < enve[1]) { + i = mid + 1; + } else { + j = mid; + } + } + tails[i] = enve[1]; + if (i == size) { + size++; + } + } + + return size; + } +} diff --git a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/readme.md b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/readme.md new file mode 100644 index 000000000..13ae560b8 --- /dev/null +++ b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/readme.md @@ -0,0 +1,31 @@ +354\. Russian Doll Envelopes + +Hard + +You are given a 2D array of integers `envelopes` where envelopes[i] = [wi, hi] represents the width and the height of an envelope. + +One envelope can fit into another if and only if both the width and height of one envelope are greater than the other envelope's width and height. + +Return _the maximum number of envelopes you can Russian doll (i.e., put one inside the other)_. + +**Note:** You cannot rotate an envelope. + +**Example 1:** + +**Input:** envelopes = \[\[5,4\],\[6,4\],\[6,7\],\[2,3\]\] + +**Output:** 3 + +**Explanation:** The maximum number of envelopes you can Russian doll is `3` (\[2,3\] => \[5,4\] => \[6,7\]). + +**Example 2:** + +**Input:** envelopes = \[\[1,1\],\[1,1\],\[1,1\]\] + +**Output:** 1 + +**Constraints:** + +* `1 <= envelopes.length <= 5000` +* `envelopes[i].length == 2` +* 1 <= wi, hi <= 104 \ No newline at end of file diff --git a/src/test/java/g0301_0400/s0350_intersection_of_two_arrays_ii/SolutionTest.java b/src/test/java/g0301_0400/s0350_intersection_of_two_arrays_ii/SolutionTest.java new file mode 100644 index 000000000..a680a93fd --- /dev/null +++ b/src/test/java/g0301_0400/s0350_intersection_of_two_arrays_ii/SolutionTest.java @@ -0,0 +1,22 @@ +package g0301_0400.s0350_intersection_of_two_arrays_ii; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void intersect() { + assertThat( + new Solution().intersect(new int[] {1, 2, 2, 1}, new int[] {2, 2}), + equalTo(new int[] {2, 2})); + } + + @Test + void intersect2() { + assertThat( + new Solution().intersect(new int[] {4, 9, 5}, new int[] {9, 4, 9, 8, 4}), + equalTo(new int[] {4, 9})); + } +} diff --git a/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java b/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java new file mode 100644 index 000000000..ce3cd5263 --- /dev/null +++ b/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java @@ -0,0 +1,52 @@ +package g0301_0400.s0352_data_stream_as_disjoint_intervals; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + SummaryRanges summaryRanges = new SummaryRanges(); + + @Test + void testGetInterval() { + summaryRanges.addNum(1); + assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 1}})); + } + + @Test + void testGetInterval2() { + summaryRanges.addNum(1); + summaryRanges.addNum(3); + assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 1}, {3, 3}})); + } + + @Test + void testGetInterval3() { + summaryRanges.addNum(1); + summaryRanges.addNum(3); + summaryRanges.addNum(7); + assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 1}, {3, 3}, {7, 7}})); + } + + @Test + void testGetInterval4() { + summaryRanges.addNum(1); + summaryRanges.addNum(2); + summaryRanges.addNum(3); + summaryRanges.addNum(7); + + assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 3}, {7, 7}})); + } + + @Test + void testGetInterval5() { + summaryRanges.addNum(1); + summaryRanges.addNum(2); + summaryRanges.addNum(3); + summaryRanges.addNum(6); + summaryRanges.addNum(7); + + assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 3}, {6, 7}})); + } +} diff --git a/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java b/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java new file mode 100644 index 000000000..3e728b602 --- /dev/null +++ b/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java @@ -0,0 +1,21 @@ +package g0301_0400.s0354_russian_doll_envelopes; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + + @Test + void testMaxEnvelopes() { + assertThat( + new Solution().maxEnvelopes(new int[][] {{5, 4}, {6, 4}, {6, 7}, {2, 3}}), + equalTo(3)); + } + + @Test + void testMaxEnvelopes2() { + assertThat(new Solution().maxEnvelopes(new int[][] {{1, 1}, {1, 1}, {1, 1}}), equalTo(1)); + } +} From 95c9381ea6aa34471bdabded36fd9f6b02a19861 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:05:49 +0700 Subject: [PATCH 02/13] Update Solution.java --- .../java/g0301_0400/s0354_russian_doll_envelopes/Solution.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java index 22bdf6390..e450a87c4 100644 --- a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java +++ b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java @@ -12,7 +12,8 @@ public int maxEnvelopes(int[][] envelopes) { int size = 0; for (int[] enve : envelopes) { - int i = 0, j = size; + int i = 0; + int j = size; while (i != j) { int mid = i + ((j - i)>> 1); From edf3f3659f6ad29a549099785959b81ad1d5a85d Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:20:40 +0700 Subject: [PATCH 03/13] fix comments --- .../Solution.java | 2 -- .../SummaryRanges.java | 8 +++++++- .../readme.md | 15 ++++++++++++++- .../s0354_russian_doll_envelopes/Solution.java | 3 --- .../{SolutionTest.java => SummaryRangesTest.java} | 5 +---- 5 files changed, 22 insertions(+), 11 deletions(-) rename src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/{SolutionTest.java => SummaryRangesTest.java} (98%) diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java index d46e5cc05..62c833046 100644 --- a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -8,11 +8,9 @@ public class Solution { public int[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); - int i = 0; int j = 0; int k = 0; - while (i < nums1.length && j < nums2.length) { if (nums1[i] < nums2[j]) { i++; diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java index 2654ad4e0..601ceb44a 100644 --- a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java @@ -2,7 +2,13 @@ // #Hard #Binary_Search #Design #Ordered_Set -import java.util.*; + +import java.util.Comparator; +import java.util.HashSet; +import java.util.NavigableSet; +import java.util.TreeSet; +import java.util.Set; + public class SummaryRanges { diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md index 72f8d13f7..575ed580a 100644 --- a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md @@ -16,7 +16,20 @@ Implement the `SummaryRanges` class: **Output:** \[null, null, \[\[1, 1\]\], null, \[\[1, 1\], \[3, 3\]\], null, \[\[1, 1\], \[3, 3\], \[7, 7\]\], null, \[\[1, 3\], \[7, 7\]\], null, \[\[1, 3\], \[6, 7\]\]\] -**Explanation:** SummaryRanges summaryRanges = new SummaryRanges(); summaryRanges.addNum(1); // arr = \[1\] summaryRanges.getIntervals(); // return \[\[1, 1\]\] summaryRanges.addNum(3); // arr = \[1, 3\] summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\]\] summaryRanges.addNum(7); // arr = \[1, 3, 7\] summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\], \[7, 7\]\] summaryRanges.addNum(2); // arr = \[1, 2, 3, 7\] summaryRanges.getIntervals(); // return \[\[1, 3\], \[7, 7\]\] summaryRanges.addNum(6); // arr = \[1, 2, 3, 6, 7\] summaryRanges.getIntervals(); // return \[\[1, 3\], \[6, 7\]\] +**Explanation:** +``` +SummaryRanges summaryRanges = new SummaryRanges(); +summaryRanges.addNum(1); // arr = \[1\] +summaryRanges.getIntervals(); // return \[\[1, 1\]\] +summaryRanges.addNum(3); // arr = \[1, 3\] +summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\]\] +summaryRanges.addNum(7); // arr = \[1, 3, 7\] +summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\], \[7, 7\]\] +summaryRanges.addNum(2); // arr = \[1, 2, 3, 7\] +summaryRanges.getIntervals(); // return \[\[1, 3\], \[7, 7\]\] +summaryRanges.addNum(6); // arr = \[1, 2, 3, 6, 7\] +summaryRanges.getIntervals(); // return \[\[1, 3\], \[6, 7\]\] +``` **Constraints:** diff --git a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java index e450a87c4..d7e08db01 100644 --- a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java +++ b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java @@ -7,10 +7,8 @@ public class Solution { public int maxEnvelopes(int[][] envelopes) { Arrays.sort(envelopes, (a, b) -> a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]); - int[] tails = new int[envelopes.length]; int size = 0; - for (int[] enve : envelopes) { int i = 0; int j = size; @@ -29,7 +27,6 @@ public int maxEnvelopes(int[][] envelopes) { size++; } } - return size; } } diff --git a/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java b/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java similarity index 98% rename from src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java rename to src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java index ce3cd5263..6465cc52b 100644 --- a/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SolutionTest.java +++ b/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java @@ -2,10 +2,9 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; - import org.junit.jupiter.api.Test; -class SolutionTest { +class SummaryRangesTest { SummaryRanges summaryRanges = new SummaryRanges(); @Test @@ -35,7 +34,6 @@ void testGetInterval4() { summaryRanges.addNum(2); summaryRanges.addNum(3); summaryRanges.addNum(7); - assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 3}, {7, 7}})); } @@ -46,7 +44,6 @@ void testGetInterval5() { summaryRanges.addNum(3); summaryRanges.addNum(6); summaryRanges.addNum(7); - assertThat(summaryRanges.getIntervals(), equalTo(new int[][] {{1, 3}, {6, 7}})); } } From df7381bcf3312ae0ac61f80ef3eb14839ca9ab16 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:24:22 +0700 Subject: [PATCH 04/13] Update readme.md --- .../readme.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md index 575ed580a..4e2d25baf 100644 --- a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/readme.md @@ -19,16 +19,16 @@ Implement the `SummaryRanges` class: **Explanation:** ``` SummaryRanges summaryRanges = new SummaryRanges(); -summaryRanges.addNum(1); // arr = \[1\] -summaryRanges.getIntervals(); // return \[\[1, 1\]\] -summaryRanges.addNum(3); // arr = \[1, 3\] -summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\]\] -summaryRanges.addNum(7); // arr = \[1, 3, 7\] -summaryRanges.getIntervals(); // return \[\[1, 1\], \[3, 3\], \[7, 7\]\] -summaryRanges.addNum(2); // arr = \[1, 2, 3, 7\] -summaryRanges.getIntervals(); // return \[\[1, 3\], \[7, 7\]\] -summaryRanges.addNum(6); // arr = \[1, 2, 3, 6, 7\] -summaryRanges.getIntervals(); // return \[\[1, 3\], \[6, 7\]\] +summaryRanges.addNum(1); // arr = [1] +summaryRanges.getIntervals(); // return [[1, 1]] +summaryRanges.addNum(3); // arr = [1, 3] +summaryRanges.getIntervals(); // return [[1, 1], [3, 3]] +summaryRanges.addNum(7); // arr = [1, 3, 7] +summaryRanges.getIntervals(); // return [[1, 1], [3, 3], [7, 7]] +summaryRanges.addNum(2); // arr = [1, 2, 3, 7] +summaryRanges.getIntervals(); // return [[1, 3], [7, 7]] +summaryRanges.addNum(6); // arr = [1, 2, 3, 6, 7] +summaryRanges.getIntervals(); // return [[1, 3], [6, 7]] ``` **Constraints:** From f0be66d4a4c5ba63d94490d23a9224195c4d938a Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:27:33 +0700 Subject: [PATCH 05/13] format code --- .../SummaryRanges.java | 4 +--- .../SummaryRangesTest.java | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java index 601ceb44a..5ed04a1ec 100644 --- a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java @@ -2,13 +2,11 @@ // #Hard #Binary_Search #Design #Ordered_Set - import java.util.Comparator; import java.util.HashSet; import java.util.NavigableSet; -import java.util.TreeSet; import java.util.Set; - +import java.util.TreeSet; public class SummaryRanges { diff --git a/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java b/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java index 6465cc52b..c1dc8b7e6 100644 --- a/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java +++ b/src/test/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRangesTest.java @@ -2,6 +2,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; + import org.junit.jupiter.api.Test; class SummaryRangesTest { From 76fb4a12cf023b9de6d186ec30302baecf319357 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:34:42 +0700 Subject: [PATCH 06/13] fix comments --- .../java/g0301_0400/s0354_russian_doll_envelopes/Solution.java | 2 -- .../g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java index d7e08db01..0488ef528 100644 --- a/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java +++ b/src/main/java/g0301_0400/s0354_russian_doll_envelopes/Solution.java @@ -12,10 +12,8 @@ public int maxEnvelopes(int[][] envelopes) { for (int[] enve : envelopes) { int i = 0; int j = size; - while (i != j) { int mid = i + ((j - i)>> 1); - if (tails[mid] < enve[1]) { i = mid + 1; } else { diff --git a/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java b/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java index 3e728b602..1a95f55d3 100644 --- a/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java +++ b/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java @@ -2,9 +2,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; - import org.junit.jupiter.api.Test; - class SolutionTest { @Test From f24dcb237259bb051a93c9217a0f39a23df85bca Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:39:43 +0700 Subject: [PATCH 07/13] Update SolutionTest.java --- .../g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java b/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java index 1a95f55d3..3e728b602 100644 --- a/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java +++ b/src/test/java/g0301_0400/s0354_russian_doll_envelopes/SolutionTest.java @@ -2,7 +2,9 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; + import org.junit.jupiter.api.Test; + class SolutionTest { @Test From 29078bde4b93aae3702e699caf64e1c856a497f9 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:50:40 +0700 Subject: [PATCH 08/13] add comments --- .../Solution.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java index 62c833046..0990cfa20 100644 --- a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -6,21 +6,33 @@ public class Solution { public int[] intersect(int[] nums1, int[] nums2) { + // First sort the array Arrays.sort(nums1); + // Similar this one as well Arrays.sort(nums2); + // "i" will point at nums1 int i = 0; + // "j" will point at nums2 int j = 0; + // "k" will point at nums1 and helps in getting the intersection answer; int k = 0; + // Loop will run until "i" & "j" doesn't reach the array boundary; while (i < nums1.length && j < nums2.length) { + // Check if nums1 value is less then nums2 value; if (nums1[i] < nums2[j]) { - i++; - } else if (nums1[i]> nums2[j]) { + i++; // Increment "i" + } + // Check if nums2 value is less then nums1 value; + else if (nums1[i]> nums2[j]) { + // Increment "j" j++; - } else { + } else { // Check if nums1 value is equals to nums2 value; + // Dump into nums1 and increment k, increment i & increment j as well; nums1[k++] = nums1[i++]; j++; } } + // Only return nums1 0th index to kth index value, because that's will be our intersection; return Arrays.copyOfRange(nums1, 0, k); } } From b6ec40101a17b36f2c85768237e59a57aa5db858 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:51:30 +0700 Subject: [PATCH 09/13] Update Solution.java --- .../s0350_intersection_of_two_arrays_ii/Solution.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java index 0990cfa20..81145228e 100644 --- a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -26,7 +26,9 @@ public int[] intersect(int[] nums1, int[] nums2) { else if (nums1[i]> nums2[j]) { // Increment "j" j++; - } else { // Check if nums1 value is equals to nums2 value; + + } else { + // Check if nums1 value is equals to nums2 value; // Dump into nums1 and increment k, increment i & increment j as well; nums1[k++] = nums1[i++]; j++; From a46347e7a85afec2a06924e1a4294eb6727e8117 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:53:11 +0700 Subject: [PATCH 10/13] Update Solution.java --- .../s0350_intersection_of_two_arrays_ii/Solution.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java index 81145228e..5eeeadc46 100644 --- a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -20,7 +20,8 @@ public int[] intersect(int[] nums1, int[] nums2) { while (i < nums1.length && j < nums2.length) { // Check if nums1 value is less then nums2 value; if (nums1[i] < nums2[j]) { - i++; // Increment "i" + // Increment "i" + i++; } // Check if nums2 value is less then nums1 value; else if (nums1[i]> nums2[j]) { From 853e4c782eb473c7a55f52d17b01ed8333b3a1b9 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:56:34 +0700 Subject: [PATCH 11/13] improve solution --- .../SummaryRanges.java | 85 ++++++++++--------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java index 5ed04a1ec..517467139 100644 --- a/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java +++ b/src/main/java/g0301_0400/s0352_data_stream_as_disjoint_intervals/SummaryRanges.java @@ -2,57 +2,66 @@ // #Hard #Binary_Search #Design #Ordered_Set -import java.util.Comparator; -import java.util.HashSet; -import java.util.NavigableSet; -import java.util.Set; -import java.util.TreeSet; +import java.util.ArrayList; +import java.util.List; public class SummaryRanges { + private static class Node { + int min; + int max; - private final NavigableSet intervals; - private final Set seen = new HashSet(); + public Node(int min, int max) { + this.min = min; + this.max = max; + } + + public Node(int val) { + min = val; + max = val; + } + } + List list; + // Initialize your data structure here. public SummaryRanges() { - this.intervals = new TreeSet(Comparator.comparingInt(i -> i[0])); + list = new ArrayList(); } public void addNum(int val) { - if (seen.contains(val)) { - return; + int left = 0; + int right = list.size() - 1; + int index = list.size(); + while (left <= right) { + int mid = left + (right - left) / 2; + Node node = list.get(mid); + if (node.min <= val && val <= node.max) { + return; + } else if (val < node.min) { + index = mid; + right = mid - 1; + } else if (val> node.max) { + left = mid + 1; + } } - seen.add(val); - int[] interval = new int[] {val, val}; - this.intervals.add(interval); - this.merge(interval); + list.add(index, new Node(val)); } public int[][] getIntervals() { - int[][] res = new int[intervals.size()][2]; - int i = 0; - for (int[] in : intervals) { - res[i] = in; - i++; + for (int i = 1; i < list.size(); i++) { + Node prev = list.get(i - 1); + Node curr = list.get(i); + if (curr.min == prev.max + 1) { + prev.max = curr.max; + list.remove(i--); + } } - return res; - } - - private void merge(int[] interval) { - // base case - if (interval == null) { - return; + int len = list.size(); + int[][] res = new int[len][2]; + for (int i = 0; i < len; i++) { + Node node = list.get(i); + res[i][0] = node.min; + res[i][1] = node.max; } - int[] lower = intervals.lower(interval); - - int[] higher; - - if (lower != null && lower[1] == interval[0] - 1) { - lower[1] = interval[1]; - intervals.remove(interval); - higher = intervals.higher(lower); - } else { - higher = intervals.higher(interval); - } - merge(higher); + return res; } } From a46cca2b47bf26ddbb9429adf193a07f8a0d258c Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 08:59:16 +0700 Subject: [PATCH 12/13] Update Solution.java --- .../s0350_intersection_of_two_arrays_ii/Solution.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java index 5eeeadc46..b94836ba0 100644 --- a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -18,13 +18,13 @@ public int[] intersect(int[] nums1, int[] nums2) { int k = 0; // Loop will run until "i" & "j" doesn't reach the array boundary; while (i < nums1.length && j < nums2.length) { - // Check if nums1 value is less then nums2 value; if (nums1[i] < nums2[j]) { + // Check if nums1 value is less then nums2 value; // Increment "i" i++; } - // Check if nums2 value is less then nums1 value; else if (nums1[i]> nums2[j]) { + // Check if nums2 value is less then nums1 value; // Increment "j" j++; From 6403a22082d8560e7241c68fdefab6d810739dc9 Mon Sep 17 00:00:00 2001 From: ThanhNIT Date: 2021年12月13日 09:00:33 +0700 Subject: [PATCH 13/13] Update Solution.java --- .../s0350_intersection_of_two_arrays_ii/Solution.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java index b94836ba0..010234afb 100644 --- a/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java +++ b/src/main/java/g0301_0400/s0350_intersection_of_two_arrays_ii/Solution.java @@ -22,8 +22,7 @@ public int[] intersect(int[] nums1, int[] nums2) { // Check if nums1 value is less then nums2 value; // Increment "i" i++; - } - else if (nums1[i]> nums2[j]) { + } else if (nums1[i]> nums2[j]) { // Check if nums2 value is less then nums1 value; // Increment "j" j++;

AltStyle によって変換されたページ (->オリジナル) /