Water collected between towers

后端 未结 26 1143
无人共我
无人共我 2020-12-22 16:51

I recently came across an interview question asked by Amazon and I am not able to find an optimized algorithm to solve this question:

You are given an input array wh

26条回答
  •  青春惊慌失措
    2020-12-22 17:16

    Here is a solution in Groovy in two passes.

    assert waterCollected([1, 5, 3, 7, 2]) == 2
    assert waterCollected([5, 3, 7, 2, 6, 4, 5, 9, 1, 2]) == 14
    assert waterCollected([5, 5, 5, 5]) == 0
    assert waterCollected([5, 6, 7, 8]) == 0
    assert waterCollected([8, 7, 7, 6]) == 0
    assert waterCollected([6, 7, 10, 7, 6]) == 0
    
    def waterCollected(towers) {
        int size = towers.size()
        if (size < 3) return 0
    
        int left = towers[0]
        int right = towers[towers.size() - 1]
    
        def highestToTheLeft = []
        def highestToTheRight = [null] * size
    
        for (int i = 1; i < size; i++) {
    
            // Track highest tower to the left
            if (towers[i] < left) {
                highestToTheLeft[i] = left
            } else {
                left = towers[i]
            }
    
            // Track highest tower to the right
            if (towers[size - 1 - i] < right) {
                highestToTheRight[size - 1 - i] = right
            } else {
                right = towers[size - 1 - i]
            }
        }
    
        int water = 0
        for (int i = 0; i < size; i++) {
            if (highestToTheLeft[i] && highestToTheRight[i]) {
                int minHighest = highestToTheLeft[i] < highestToTheRight[i] ? highestToTheLeft[i] : highestToTheRight[i]
                water += minHighest - towers[i]
            }
        }
    
        return water
    }
    

    Here same snippet with an online compiler: https://groovy-playground.appspot.com/#?load=3b1d964bfd66dc623c89

提交回复
热议问题