@@ -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}
0 commit comments