Skip to content

Commit c269af0

Browse files
committed
Seventh solution - 106/118 passed
1 parent 6a89fb7 commit c269af0

2 files changed

Lines changed: 59 additions & 52 deletions

File tree

src/main/java/com/rkabanov/leetcode/p757/Solution.java

Lines changed: 26 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,25 @@ public int intersectionSizeTwo(int[][] intervals) {
2525
// try to reuse from result numbers
2626
List<Integer> reuseNumbers = reuseTwoNumbers(interval, resultNumbers);
2727
System.out.println(" Reuse: " + reuseNumbers.toString());
28-
resultNumbers.addAll(reuseNumbers);
2928

3029
intervalNumbersRemainingToPick -= reuseNumbers.size();
3130

32-
if (intervalNumbersRemainingToPick > 0) {
33-
// find remaining numbers from the best intersection OF REMAINING INTERVALS ONLY, excluding already used
34-
ArrayList<Integer> bestNumbers = twoMostFrequentNumbers(interval, intervalList, resultNumbers);
35-
System.out.println(" Best numbers: " + bestNumbers.toString());
36-
37-
// pick remaining numbers from best if available
38-
while (intervalNumbersRemainingToPick > 0 && !bestNumbers.isEmpty()) {
39-
System.out.println(" Adding " + bestNumbers.get(0));
40-
resultNumbers.add(bestNumbers.remove(0));
41-
intervalNumbersRemainingToPick--;
42-
minResultLength++;
43-
}
31+
// find remaining numbers from the best intersection OF REMAINING INTERVALS ONLY, excluding already used
32+
while (intervalNumbersRemainingToPick > 0) {
33+
int bestNumber = mostFrequentNumber(interval, intervalList, resultNumbers);
34+
System.out.println(" Next best: " + bestNumber);
35+
resultNumbers.add(bestNumber);
36+
intervalNumbersRemainingToPick--;
37+
minResultLength++;
38+
39+
// remove possible intervals that now contain new numbers from result numbers
40+
intervalList = remainingIntervals(intervalList, resultNumbers);
41+
System.out.println("Remaining " + Arrays.deepToString(intervals));
4442
}
4543

46-
// remove current interval - processed
47-
intervalList.remove(0);
48-
// remove possible intervals that now contain 2 numbers from result numbers
49-
intervalList = remainingIntervals(intervalList, resultNumbers);
50-
System.out.println("Remaining " + Arrays.deepToString(intervals));
44+
// safeguard
45+
intervalList.remove(interval);
46+
// intervalList.remove(0);
5147
}
5248

5349
System.out.println("Result set: " + resultNumbers);
@@ -97,27 +93,29 @@ List<Integer> reuseTwoNumbers(int[] interval, Set<Integer> resultNumbers) {
9793
return result;
9894
}
9995

100-
HashMap<Integer, Integer> calculateHistogram(List<int[]> intervals) {
96+
HashMap<Integer, Integer> calculateHistogram(int[] currentInterval, List<int[]> intervals) {
10197
// overlap all intervals and count each number frequency
10298
HashMap<Integer, Integer> result = new HashMap<>();
103-
for (int[] interval : intervals) {
104-
for (int num = interval[0]; num <= interval[1]; num++) {
105-
result.merge(num, 1, Integer::sum);
99+
100+
for (int num = currentInterval[0]; num <= currentInterval[1]; num++) {
101+
for (int[] interval : intervals) {
102+
if (num >= interval[0] && num <= interval[1]) {
103+
result.merge(num, 1, Integer::sum);
104+
}
106105
}
107106
}
108107

109108
return result;
110109
}
111110

112-
ArrayList<Integer> twoMostFrequentNumbers(int[] interval, List<int[]> intervals, Set<Integer> resultNumbers) {
111+
int mostFrequentNumber(int[] interval, List<int[]> intervals, Set<Integer> resultNumbers) {
113112
// best numbers: "1" with score 2, "2" with score 3
114113
int from = interval[0];
115114
int to = interval[1];
116115

117116
int best = -1;
118-
int secondBest = -1;
119117

120-
Map<Integer, Integer> histogram = calculateHistogram(intervals);
118+
Map<Integer, Integer> histogram = calculateHistogram(interval, intervals);
121119
System.out.println(" Histogram: " + histogram);
122120

123121
// go over rest of numbers, update best and second best if met
@@ -126,41 +124,17 @@ ArrayList<Integer> twoMostFrequentNumbers(int[] interval, List<int[]> intervals,
126124
continue;
127125
}
128126

129-
int score = histogram.get(num);
130-
131-
// take in first 2 numbers in correct order
127+
// take in first number
132128
if (best == -1) {
133129
best = num;
134130
continue;
135131
}
136132

137-
if (secondBest == -1) {
138-
if (score > histogram.get(best)) {
139-
// new number is new best
140-
secondBest = best;
141-
best = num;
142-
} else {
143-
// new number is second best
144-
secondBest = num;
145-
}
146-
continue;
147-
}
148-
149-
if (score > histogram.get(best)) {
150-
secondBest = best;
133+
if ((int) histogram.get(num) > histogram.get(best)) {
151134
best = num;
152-
} else if (score > histogram.get(secondBest)) {
153-
secondBest = num;
154135
}
155136
}
156137

157-
ArrayList<Integer> result = new ArrayList<>();
158-
if (best != -1) {
159-
result.add(best);
160-
}
161-
if (secondBest != -1) {
162-
result.add(secondBest);
163-
}
164-
return result;
138+
return best;
165139
}
166140
}

src/test/java/com/rkabanov/leetcode/p757/SolutionTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,37 @@ public void testSolution6() {
8383
});
8484
assertEquals(5, result);
8585
}
86+
87+
@Test
88+
public void testSolution7() {
89+
var solution = new Solution();
90+
int result = solution.intersectionSizeTwo(new int[][]{
91+
{5, 25},
92+
{11, 15},
93+
{13, 23},
94+
{1, 2},
95+
{5, 8},
96+
{4, 13},
97+
{2, 6},
98+
{8, 12},
99+
{3, 8},
100+
{2, 23},
101+
{8, 16},
102+
{9, 22},
103+
{15, 21},
104+
{2, 21},
105+
{2, 14},
106+
{9, 19},
107+
{10, 18},
108+
{7, 18},
109+
{12, 21},
110+
{9, 16},
111+
{11, 13},
112+
{7, 18},
113+
{16, 19},
114+
{4, 25},
115+
{16, 19},
116+
});
117+
assertEquals(8, result);
118+
}
86119
}

0 commit comments

Comments
 (0)