zoukankan      html  css  js  c++  java
  • Find both the minimum and maximum in array using less than 2 * (N

    package _interview_question
    
    /**
     * Good morning! Here's your coding interview problem for today.
    This problem was asked by Facebook.
    Given an array of numbers of length N, find both the minimum and maximum using less than 2 * (N - 2) comparisons.
     * */
    class Solution18 {
        /*
        * Solution 1: linear search, 2*(n-2) comparisons in the worst case, 1+n-2 in best case, Time:O(n),Space:O(1);
        * 
        * Solution 2: Divide and Conquer, divide the array into two parts, 3*n/2-2 comparisons,
        * compare minimum and maximum in two parts to get the result of whole array,
        * Time:O(n), Space:O(n)
        * */
        fun findMinMax(array: IntArray): MinMax  {
            return solution2(array)
        }
    
        fun solution1(array: IntArray): MinMax {
            val n = array.size
            val minMax = MinMax()
            if (n == 1) {
                minMax.min = array[0]
                minMax.max = array[0]
                return minMax
            }
            //more than 2 numbers, init minimum and maximum
            if (array[0] > array[1]) {
                minMax.max = array[0]
                minMax.min = array[1]
            } else {
                minMax.max = array[1]
                minMax.min = array[0]
            }
            for (i in 2 until n) {
                if (array[i] > minMax.max) {
                    minMax.max = array[i]
                } else if (array[i] < minMax.min) {
                    minMax.min = array[i]
                }
            }
            return minMax
        }
    
        fun solution2(array: IntArray): MinMax {
            val l = 0
            val r = array.size - 1
            return getMinMax(array, l, r)
        }
    
        private fun getMinMax(array: IntArray, left: Int, right: Int): MinMax {
            val pair = MinMax()
            //only one element
            if (left == right) {
                pair.min = array[left]
                pair.max = array[left]
                return pair
            }
            //two element
            if (left + 1 == right) {
                if (array[left] > array[right]) {
                    pair.min = array[right]
                    pair.max = array[left]
                } else {
                    pair.min = array[left]
                    pair.max = array[right]
                }
                return pair
            }
            //if more than two element
            var pairLeft: MinMax? = null
            var pairRight: MinMax? = null
            val mid = left + (right - left) / 2
            pairLeft = getMinMax(array, left, mid)
            pairRight = getMinMax(array, mid + 1, right)
            //compare minimum of two parts
            if (pairLeft.min < pairRight.min) {
                pair.min = pairLeft.min
            } else {
                pair.min = pairRight.min
            }
            //compare maximum of two parts
            if (pairLeft.max > pairRight.max) {
                pair.max = pairLeft.max
            } else {
                pair.max = pairRight.max
            }
            return pair
        }
    }
    
    class MinMax {
        var min = Int.MAX_VALUE
        var max = Int.MIN_VALUE
    }
  • 相关阅读:
    BZOJ4416 [Shoi2013]阶乘字符串 【序列自动机 + 状压dp】
    BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】
    快速求原根
    BZOJ2530 [Poi2011]Party 【贪心】
    BZOJ2213 [Poi2011]Difference 【乱搞】
    BZOJ2276 [Poi2011]Temperature 【单调队列】
    多项式除法
    loj2538 「PKUWC2018」Slay the Spire 【dp】
    loj2537 「PKUWC2018」Minimax 【概率 + 线段树合并】
    Java多线程之线程的暂停
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14271241.html
Copyright © 2011-2022 走看看