算法实现柱形集合积水面积

用一个数组代表柱形墙的的高度。当下雨的时候柱形墙能积水的体积是多少

下面是python的实现算法:

# -*- coding: utf-8 -*-
def savewater(arr):
    point_l=0
    max_l=arr[0]
    point_r=len(arr)-1
    max_r=arr[len(arr)-1]
    volume=0
    #point_l从左向右遍历,point_r从右向左遍历
    while point_l<point_r:
        #能积水的标准时两边的高度大于中间的
        if max_l<max_r:
            point_l=point_l+1
            if max_l<=arr[point_l]:
                max_l=arr[point_l]
            else:
                volume=volume+max_l-arr[point_l]
        else:
            point_r=point_r-1
            if max_r<=arr[point_r]:
                max_r=arr[point_r]
            else:
                volume=volume+max_r-arr[point_r]
    return volume

if __name__==‘__main__‘:
    arr=[1,2,3,4,2,1,1,5,3,2]
    volume=savewater(arr)
    print volume

java实现算法:

package com.gh.d1;

/**
 * Created by Lenovo on 2014/12/29.
 */
public class D1_1 {
    public static void main(String[] args){
        int[] array=new int[]{1,2,3,4,2,1,1,5,3,2};
        int volume=savewater(array);
        System.out.println(volume);
    }
    public static int savewater(int[] array) {
        int point_l = 0;
        int max_l = 0;
        int point_r = array.length;
        int max_r = array[array.length - 1];
        int volume = 0;
        while (point_l < point_r) {
            if (max_l < max_r) {
                point_l++;
                if (max_l <= array[point_l]) {
                    max_l = array[point_l];
                } else {
                    volume = volume + max_l - array[point_l];
                }
            } else {
                point_r--;
                if (max_r <= array[point_r]) {
                    max_r = array[point_r];
                } else {
                    volume = volume + max_r - array[point_r];
                }
            }
        }
        return volume;
    }
}

golang实现:

package main

import (
    "fmt"
)

func main() {
    arr := []int{1, 2, 3, 4, 2, 1, 1, 5, 3, 2}
    volume := savewater(arr)
    fmt.Println(volume)
}
func savewater(arr []int) int {
    point_l := 0
    max_l := 0
    point_r := len(arr) - 1
    max_r := arr[len(arr)-1]
    volume := 0
    for point_l < point_r {
        if max_l < max_r {
            point_l++
            if max_l < arr[point_l] {
                max_l = arr[point_l]
            } else {
                volume = volume + max_l - arr[point_l]
            }
        } else {
            point_r--
            if max_r < arr[point_r] {
                max_r = arr[point_r]
            } else {
                volume = volume + max_r - arr[point_r]
            }
        }
    }
    return volume
}
时间: 2024-10-09 12:15:35

算法实现柱形集合积水面积的相关文章

计算机算法学习(1) - 不相交集合数据结构

不相交集合 故名思意就是一种含有多个不相交集合的数据结构.典型的应用是确定无向图中连通子图的个数.其基本操作包括: Make-Set(x):建立一个新的集合,集合的成员是x: Union(x,y): 将包含x和y的集合合并为一个集合: Find-Set(x): 返回指向包含x的集合的指针: 下面是一个例子,(a)是一个无向图,(b)是使用不相交集合来找连通子图的个数.做法是初始为各个顶点为一个集合,然后遍历各个边,把边的端点的集合进行合并,当处理完所有的边,能连通的顶点就在一个集合里了,这样就生

highcharts 柱形堆叠图

<!doctype html> <html lang="en"> <head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <script type="text/javascript"

洛谷 P1318 积水面积

P1318 积水面积 将每层可积水的面积加起来 每层可积水的面积=左边第一个比他大右边的所有空位+右边第一个比他大的左边的所有空位-这一层的所有空位(他指当前高度 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000 4 5 int n,h[maxn],tot,maxx; 6 int l[maxn],r[maxn],ans; 7 bool if_; 8 char ch; 9 inline void rea

highcharts 分组柱形堆叠图

为要实现柱形堆叠图,本身只有一个分组,也要使用这样的图像格式来完成. 从highcharts官网上找到例子,复制过来,经过好几轮的修改,总是报错"SCRIPT5007: 无法获取未定义或 null 引用的属性"dataMin"".一直找不到原因,网上搜也找不到,然后让同事看,一开始同事说我传递series的数据格式不对,应该传递array()格式的,例子中是这样的格式: series: [{            name: 'John',            d

用XCL-Charts定制多柱形堆积图

有网友发了张图,问我实现的方法. 与一般的柱形图不一样,这张图很特别,相信他要找到现成的,对得上号的图表将不是件易事. 通常图表库实现的不是通常意义上的柱形图,就是单纯的堆积图,很少有这种混在一起展现的情况出现.没得法,要定制才能实现的了. 网友的原图(应当没侵权吧) 利用XCL-Charts实现的效果图: 网友的这张表面看起来,是同一个标签,两个堆积柱形并排放在一起,但依我的经验,要原汁原味让图表库提供这种图是很难的, 参数及数据位置计算很难处理.只能利用现有图表,采用混合方式实现.仔细观察了

[Swift通天遁地]三、手势与图表-(12)创建复合图表:包含线性图表和柱形图表

本文将演示如何创建复合图表:包含线性图表和柱形图表. 首先确保在项目中已经安装了所需的第三方库. 点击[Podfile],查看安装配置文件. 1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'Charts' 7 end 根据配置文件中的相关配置,安装第三方库. 然后点击打开[DemoApp.xcwork

积水面积

题目描述 一组正整数,分别表示由正方体叠起的柱子的高度.若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000).找出所有可能积水的地方(图中蓝色部分),统计它们可能积水的面积总和(计算的是图中的横截面积.一个立方体的位置,为一个单位面积). 如图:柱子高度变化为 0 1 0 2 1 2 0 0 2 0 图中蓝色部分为积水面积,共有6个单位面积积水. 输入格式 两行,第一行n,表示有n个数(3<=n<=10000).第2行连续n个数表示依次由正方体迭起的高度,保证

使用MinHash算法计算两个集合的相似度

集合相似度计算是一个常见的问题.例如,已知看过芈月传的人都有哪些,还知道看过琅琊榜的人都有哪些,那么想知道同时看过两者的人群占至少看过一部的人群的占比,就是求这两个集合的相似度: 集合A = 看过芈月传的人群集合B = 看过琅琊榜的人群相似度 = |A∩B| / |A∪B| = 既看过芈月传又看过琅琊榜的人数 / 看过芈月传或琅琊榜的人数 当集合的元素较少时,我们可以采用逐一比较的方式来找出既在集合A出现也在集合B出现的人,统计其人数,再除以至少在集合A或集合B出现的人数,得到相似度. 然而当集

bzoj2564集合的面积

题目描述 对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积. 对于两个点集A和B,定义集合的和为: A+B={(xiA+xjB,yiA+yjB ):(xiA,yiA )∈A,(xjB,yjB )∈B} 现在给定一个N个点的集合A和一个M个点的集合B,求2F(A+B). 输入格式 第一行包含用空格隔开的两个整数,分别为N和M: 第二行包含N个不同的数对,表示A集合中的N个点的坐标: 第三行包含M个不同的数对,表示B集合中的M个点的坐标. 输出格式 一共输