Water collected between towers

后端 未结 26 1092
无人共我
无人共我 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:23

    Here is my take to the problem, I use a loop to see if the previous towers is bigger than the actual one. If it is then I create another loop to check if the towers coming after the actual one are bigger or equal to the previous tower. If that's the case then I just add all the differences in height between the previous tower and all other towers. If not and if my loop reaches my last object then I simply reverse the array so that the previous tower becomes my last tower and call my method recursively on it. That way I'm certain to find a tower bigger than my new previous tower and will find the correct amount of water collected.

    public class towers {
        public static int waterLevel(int[] i) {
            int totalLevel = 0;
    
            for (int j = 1; j < i.length - 1; j++) {
                if (i[j - 1] > i[j]) {
                    for (int k = j; k < i.length; k++) {
                        if (i[k] >= i[j  - 1]) {
                            for (int l = j; l < k; l++) { 
                                totalLevel += (i[j - 1] - i[l]);
                            }
    
                            j = k;
                            break;
                        }  
    
                        if (k == i.length - 1) {
                            int[] copy = Arrays.copyOfRange(i, j - 1, k + 1);
                            int[] revcopy = reverse(copy);
                            totalLevel += waterLevel(revcopy);
                        }
                    }
                }
            }
    
            return totalLevel;
        }
    
        public static int[] reverse(int[] i) {
            for (int j = 0; j < i.length / 2; j++) {
                int temp = i[j];
                i[j] = i[i.length - j - 1];
                i[i.length - j - 1] = temp;
            }
    
            return i;
        }
    
        public static void main(String[] args) {
            System.out.println(waterLevel(new int[] {1, 6, 3, 2, 2, 6}));
        }
    }
    

提交回复
热议问题