首页 > 试题广场 >

容器盛水问题

[编程题]容器盛水问题
  • 热度指数:4928 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
具体请参考样例解释

输入描述:
第一行一个整数N,表示数组长度。

接下来一行N个数表示数组内的数。


输出描述:
输出一个整数表示能装多少水。
示例1

输入

6
3 1 2 5 2 4 

输出

5 

说明

示例2

输入

5
4 5 1 3 2 

输出

2 

备注:

左右双指针,左边的最大高度减去左指针当前所在位置的高度,就是当前位置贡献的水量(因为最大高度把水拦住了),右指针同理。对于左右的最大高度,由于最终水量取决于矮的高度,因此每次移动所指位置矮的指针,左边最大高度矮于右边就右移左指针,反之左移右指针。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strArr = br.readLine().split(" ");
        int[] heights = new int[n];
        for(int i = 0; i < n; i++) heights[i] = Integer.parseInt(strArr[i]);
        int leftMax = heights[0], rightMax = heights[n - 1];
        int left = 0, right = n - 1;
        long volumn = 0;
        while(left < right){
            leftMax = Math.max(leftMax, heights[left]);
            rightMax = Math.max(rightMax, heights[right]);
            if(leftMax < rightMax){
                volumn += leftMax - heights[left];
                left ++;
            }else{
                volumn += rightMax - heights[right];
                right --;
            }
        }
        System.out.println(volumn);
    }
}

发表于 2021-11-17 15:47:07 回复(0)