• 求数组给定的容器的蓄水量


    题目描述

    给定一个非负数的数组,代表一个容器。例如数组[0,1,0,2,1,0,1,3,2,1,2,1],就是 以下图形中黑色的部分。如果用这个容器接水的话,请问可以接多少水?还以这个数组为例,可以接6格水,就是以下图形中蓝色的部分。
    要求:实现时间复杂度O(N),额外空间复杂度O(1)的解法。
    题目图片

    首先看一下简单的算法

    解法一:使用辅助数组

    原理:假设我要求第i个位置处的水的值,则我应该找到i左边的最大值和i右边的最大值,使用两个数组
    L和R来表示。其中L[i]表示i前面的最大值,R[i]表示后面的最大值。然后使用两个最大值中的较小的值去减去i的值,如果i的值小于等于0,则积蓄的水为0,否则就是相减后的值。由于遍历求每个i是从左到右的,每次i左边的最大值只需要一个值来保存。
    时间复杂度:O(n),空间复杂度:O(n)

    1. publicstaticint maxWater(int[] arr){
    2. if(arr ==null|| arr.length <=2)return0;
    3. int maxL = arr[0];
    4. int[] maxR =newint[arr.length];
    5. int max =0;
    6. for(int i = arr.length -1; i >=0; i--){
    7. if(arr[i]> max) maxR[i]= max = arr[i];
    8. else maxR[i]= max;
    9. }
    10. max =0;//用来计算总的水量
    11. for(int i =1; i < arr.length -1; i++){
    12. if(arr[i]> maxL) maxL = arr[i];//更新i左边的最大值
    13. max +=Math.max(Math.min(maxL, maxR[i])- arr[i],0);
    14. }
    15. return max;
    16. }

    解法二:使用四个变量

    5 4 … 3 7
    | |
    从左右两边向中间遍历,首先设定左右两边的最大值为数组第一个和最后一个数,当左边的值小于右边的值,左边值小于右边值, 则说明左边的值已经可以计算左边的下一个值(这是左边的值已经小于右边的值,因为水量是根据左右最大值的小值确定的,左边的i左边的最大值是确定了,且是小于左右的值,说明计算i时,是使用左边的最大值计算的,因此此时可以计算左边的下一个值),同理当右边最大值小于左边最大值时,可以计算右边的上一个值。
    实现时间复杂度O(N),空间复杂度O(1)。
    实现:

    1. publicstaticint maxWaterWithConstSpace(int[] arr){
    2. if(arr ==null|| arr.length <=2)return0;
    3. int maxL = arr[0];
    4. int maxR = arr[arr.length -1];
    5. int max =0;//用来计算总的水量
    6. max =0;
    7. int l =1;
    8. int r = arr.length -2;
    9. while(l <= r){
    10. if(maxL <= maxR){
    11. max +=Math.max(0, maxL - arr[l]);
    12. if(arr[l++]> maxL) maxL = arr[l-1];
    13. }else{
    14. max +=Math.max(0, maxR - arr[r]);
    15. if(arr[r--]> maxR) maxR = arr[r +1];
    16. }
    17. }
    18. return max;
    19. }





  • 相关阅读:
    小小知识点(二)——如何修改win10 的C盘中用户下的文件夹名称
    Day15 Python基础之logging模块(十三)
    Day14 Python基础之os/sys/hashlib模块(十二)
    Day13 Python基础之time/datetime/random模块一(十一)
    Day12 Python基础之生成器、迭代器(高级函数)(十)
    Day11 Python基础之装饰器(高级函数)(九)
    火狐HACK
    javascript操作cookie
    <!DOCTYPE>标签的定义与用法
    前端性能优化
  • 原文地址:https://www.cnblogs.com/ggmfengyangdi/p/5706803.html
Copyright © 2020-2023  润新知