美文网首页
以数组大小,来确定装水的问题

以数组大小,来确定装水的问题

作者: shoulda | 来源:发表于2018-07-17 17:14 被阅读0次

题目:

这个题目很妙,需要左右两个指针,另外还需要另外两个变量,一个代表左边的最大值,一个代表右边的最大值

给定一个数组代表一个容器,
比如[3,1,2,4],
代表0位置是一个宽度为1, 高度为3的直方图。
代表1位置是一个宽度为1, 高度为1的直方图。
代表2位置是一个宽度为1, 高度为2的直方图。
代表3位置是一个宽度为1, 高度为4的直方图。
所有直方图的底部都在一条水平线上, 且紧靠着。
把这个图想象成一个容器, 这个容器可以装3格的水。
给定一个没有负数的数组arr, 返回能装几格水?


package basic_class_08;

import java.util.HashMap;
import java.util.Map.Entry;

public class Code_01_WaterProblem {

    public static int getWater1(int[] arr) {
        if (arr == null || arr.length < 3) {
            return 0;
        }
        int value = 0;
        for (int i = 1; i < arr.length - 1; i++) {
            int leftMax = 0;
            int rightMax = 0;
            for (int l = 0; l < i; l++) {
                leftMax = Math.max(arr[l], leftMax);
            }
            for (int r = i + 1; r < arr.length; r++) {
                rightMax = Math.max(arr[r], rightMax);
            }
            value += Math.max(0, Math.min(leftMax, rightMax) - arr[i]);
        }
        return value;
    }

    public static int getWater2(int[] arr) {
        if (arr == null || arr.length < 3) {
            return 0;
        }
        int n = arr.length - 2;
        int[] leftMaxs = new int[n];
        leftMaxs[0] = arr[0];
        for (int i = 1; i < n; i++) {
            leftMaxs[i] = Math.max(leftMaxs[i - 1], arr[i]);
        }
        int[] rightMaxs = new int[n];
        rightMaxs[n - 1] = arr[n + 1];
        for (int i = n - 2; i >= 0; i--) {
            rightMaxs[i] = Math.max(rightMaxs[i + 1], arr[i + 2]);
        }
        int value = 0;
        for (int i = 1; i <= n; i++) {
            value += Math.max(0, Math.min(leftMaxs[i - 1], rightMaxs[i - 1]) - arr[i]);
        }
        return value;
    }

    public static int getWater3(int[] arr) {
        if (arr == null || arr.length < 3) {
            return 0;
        }
        int n = arr.length - 2;
        int[] rightMaxs = new int[n];
        rightMaxs[n - 1] = arr[n + 1];
        for (int i = n - 2; i >= 0; i--) {
            rightMaxs[i] = Math.max(rightMaxs[i + 1], arr[i + 2]);
        }
        int leftMax = arr[0];
        int value = 0;
        for (int i = 1; i <= n; i++) {
            value += Math.max(0, Math.min(leftMax, rightMaxs[i - 1]) - arr[i]);
            leftMax = Math.max(leftMax, arr[i]);
        }
        return value;
    }

    public static int getWater4(int[] arr) {
        if (arr == null || arr.length < 3) {
            return 0;
        }
        int value = 0;
        int leftMax = arr[0];
        int rightMax = arr[arr.length - 1];
        int l = 1;
        int r = arr.length - 2;
        while (l <= r) {
            if (leftMax <= rightMax) {
                value += Math.max(0, leftMax - arr[l]);
                leftMax = Math.max(leftMax, arr[l++]);
            } else {
                value += Math.max(0, rightMax - arr[r]);
                rightMax = Math.max(rightMax, arr[r--]);
            }
        }
        return value;
    }

    public static int[] generateRandomArray() {
        int[] arr = new int[(int) (Math.random() * 98) + 2];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 200) + 2;
        }
        return arr;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 1000000; i++) {
            int[] arr = generateRandomArray();
            int r1 = getWater1(arr);
            int r2 = getWater2(arr);
            int r3 = getWater3(arr);
            int r4 = getWater4(arr);
            if (r1 != r2 || r3 != r4 || r1 != r3) {
                System.out.println("What a fucking day! fuck that! man!");
            }
        }

        HashMap<String, String> map = new HashMap<String, String>();

        for (Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " , " + entry.getValue());
        }

    }

}

相关文章

  • 以数组大小,来确定装水的问题

    题目: 这个题目很妙,需要左右两个指针,另外还需要另外两个变量,一个代表左边的最大值,一个代表右边的最大值

  • 交错数组

    1. 定义: 交错数组是元素为数组的数组。 交错数组元素的维度和大小可以不同。 交错数组有时称为“数组的数组”。以...

  • 数组

    数组(英语:Array)Wiki 特点 内存上相连续 大小相同 读取速度快 需要事先知道数据大小以分配数组空间 无...

  • 正负数标记法

    问题:找到所有数组中消失的数字给定一个范围在 1 ≤ a[i] ≤n(n= 数组大小 ) 的 整型数组,数组中的元...

  • 数组的大小

    数组的大小 sizeof给出整个素组所占据的内容的代销,单位是字节 sizeof(a[0])是给出数组中单个元素的...

  • 【数据结构】树状数组

    【数据结构】树状数组 讲到了线段树,那就顺便讲讲树状数组吧。 问题: 一个固定大小 n 的有限数组 xaction...

  • 数组(Array)

    数组是一种大小固定的数据结构,对线性表的所有操作都可以通过数组来实现。虽然数组一旦创建之后,它的大小就无法改变了,...

  • C语言-分别使用数组和指针计算数组之和

    问题描述:分别使用数组和指针计算数组之和 源代码: 运行结果: 程序参数: 输出大小: 149.874023437...

  • 32、[VBA入门到放弃笔记] 动态的数组

    动态的数组事先是没有设置大小的。 定义动态的数组首先要声明,Dim arr(),然后用Redim命令来设置数组的大...

  • Java常用库-ArrayList

    1.ArrayList简介 可调整大小数组的实现,该类还提供了一些方法来控制用于内部存储列表的数组大小。用Coll...

网友评论

      本文标题:以数组大小,来确定装水的问题

      本文链接:https://www.haomeiwen.com/subject/ffjgpftx.html