-
Notifications
You must be signed in to change notification settings - Fork 93
added tasks 350, 352, 354 #111
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
ee39ec4
95c9381
edf3f36
df7381b
f0be66d
76fb4a1
f24dcb2
29078bd
b6ec401
a46347e
853e4c7
a46cca2
6403a22
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
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); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You may keep comments in solutions. Trailing comment may be moved to separate line. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. like that ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, we may keep comments. We only need to move them, in separate line above. |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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? |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
package g0301_0400.s0352_data_stream_as_disjoint_intervals; | ||
|
||
// #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; | ||
|
||
|
||
public class SummaryRanges { | ||
|
||
private final NavigableSet<int[]> intervals; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This solution is not very fast There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I found better implemetation public class SummaryRanges { private static class Node { int min; int max; public Node(int min, int max) { this.min = min; this.max = max; } public Node(int val) { min = val; max = val; } } List<Node> list; /** Initialize your data structure here. */ public SummaryRanges() { list = new ArrayList<>(); } public void addNum(int val) { 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; } } list.add(index, new Node(val)); } public int[][] getIntervals() { 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--); } } 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; } return res; } } There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ok |
||
private final Set<Integer> 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); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
352\. Data Stream as Disjoint Intervals | ||
|
||
Hard | ||
|
||
Given a data stream input of non-negative integers <code>a<sub>1</sub>, a<sub>2</sub>, ..., a<sub>n</sub></code>, 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 <code>[start<sub>i</sub>, end<sub>i</sub>]</code>. | ||
|
||
**Example 1:** | ||
|
||
**Input** \["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"\] \[\[\], \[1\], \[\], \[3\], \[\], \[7\], \[\], \[2\], \[\], \[6\], \[\]\] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like two lines. It may be changes with code block. |
||
|
||
**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\]\] | ||
``` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove escapes and replace code block with 4 spaces ident. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We may use four space ident for code blocks. |
||
|
||
**Constraints:** | ||
|
||
* <code>0 <= val <= 10<sup>4</sup></code> | ||
* At most <code>3 * 10<sup>4</sup></code> 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? |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
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; | ||
int j = size; | ||
|
||
while (i != j) { | ||
int mid = i + ((j - i) >> 1); | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove empty lines There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I usually code spaces like that to be easier to see than just writing a block There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The idea to use plugin to format codes. If it allows to remove empty line - remove it. |
||
if (tails[mid] < enve[1]) { | ||
i = mid + 1; | ||
} else { | ||
j = mid; | ||
} | ||
} | ||
tails[i] = enve[1]; | ||
if (i == size) { | ||
size++; | ||
} | ||
} | ||
return size; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
354\. Russian Doll Envelopes | ||
|
||
Hard | ||
|
||
You are given a 2D array of integers `envelopes` where <code>envelopes[i] = [w<sub>i</sub>, h<sub>i</sub>]</code> 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` | ||
* <code>1 <= w<sub>i</sub>, h<sub>i</sub> <= 10<sup>4</sup></code> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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})); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
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 SummaryRangesTest { | ||
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}})); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 { | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove empty line. |
||
@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)); | ||
} | ||
} |