Find the most frequent element in all intervals

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
    }

}

 

posted @ 2020-06-05 12:52  johnny_zhao  阅读(181)  评论(0编辑  收藏  举报