package _interview_question /** * Problem: Find the most frequent element in all intervals Given an unsorted list of start and end time ( a range basically), find any number within all the ranges that occurs in maximum number of intervals. Example: [[1,4],[3,5],[4,6]]. Answer should be 4 because it occurs in all the interval ranges. * */ class Solution6 { /* * solution 1:brute force, Time complexity:O(n*n), Space complexity:O(n) * */ fun findMostFrequent(intervals: Array<IntArray>): Int { val map = HashMap<Int, Int>() for (interval in intervals) { for (item in interval) { map.put(item, map.getOrDefault(item, 0) + 1) } } var maxValue = Int.MIN_VALUE for (item in map) { maxValue = Math.max(maxValue, item.value) } var result = 0 for (item in map) { if (maxValue == item.value) { result = item.key } } println(map) return result } /* * solution 2:Time complexity:O(n), Space complexity:O(n); 1.Initialize a freq array with 0, let the size of the array be 10^6 as this is the maximum possible. 2.Increase the freq[l] by 1, for every starting index of the given range. 3.Decrease the freq[r+1] by 1 for every ending index of the given range. 4.Iterate from the minimum Left to the maximum Right and add the frequencies by freq[i] += freq[i-1]. 5.The index with the maximum value of freq[i] will be the answer. * */ fun findMostFrequent2(intervals: Array<IntArray>): Int { val freq = IntArray(1000000) var first = 0 var last = 0 /* * eg: { {1, 6}, {2, 3}, {2, 5}, {3, 8} } { 0: 0 1: 1 2: 2 3: 1 4: -1 7: -1 6: -1 9: -1 } change into: 1 -> 0 + 1 2 -> 1 + 2 3 -> 4 4 -> 3 5 -> 3 6 -> 2 7 -> 1 8 -> 1 * */ for (i in intervals.indices) { val left = intervals[i][0] val right = intervals[i][1] freq[left]++ freq[right + 1]-- first = Math.min(left, first) last = Math.max(right, last) } var maxFrequent = 0 var num = 0 //check for most frequent element for (i in first + 1..last) { //increase the frequency freq[i] = freq[i - 1] + freq[i] if (freq[i] > maxFrequent) { maxFrequent = freq[i] num = i } } return num } }