Trapping Rain Water LeetCode JavaScript JS
2016-06-21 17:29
218 查看
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
Subscribe to see which companies asked this question
开始想的是从左边开始扫到右边,取A[i]左边的最大值和右边的最大值中的最小值再减去A[i]的值就是当前格的存水量
哦超时了。。
那就优化一下,不要每次都遍历取最大值。
哦还是超时了。百度了一下,思路是先看最高点,然后从两边遍历到中间。
AC啦哈哈哈
For example,
Given
[0,1,0,2,1,0,1,3,2,1,2,1], return
6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
Subscribe to see which companies asked this question
开始想的是从左边开始扫到右边,取A[i]左边的最大值和右边的最大值中的最小值再减去A[i]的值就是当前格的存水量
var trap = function(height) { if(height.length<2) { return 0; } var result=0; for(var i = 1 ; i < height.length-1;i++){ var arrayLeft=height.slice(0,i); var arrayRight=height.slice(i,height.length); var leftMax=Math.max.apply( Math, arrayLeft ); var rightMax=Math.max.apply(Math, arrayRight ); var min=Math.min(leftMax,rightMax); if(min>height[i]){ result+=(min-height[i]); } } return result; };
哦超时了。。
那就优化一下,不要每次都遍历取最大值。
var trap = function(height) { if(height.length<2) { return 0; } var result=0; var leftMax=0; var rightMax=Math.max.apply(Math,height.slice(2,height.length)); for(var i = 1 ; i < height.length-1;i++){ var arrayLeft=height.slice(0,i); var arrayRight=height.slice(i,height.length); leftMax=Math.max(height[i-1],leftMax); if(rightMax==height[i]){ rightMax=Math.max.apply(Math,height.slice(i+1,height.length)); } var min = Math.min(rightMax,leftMax); if(min>height[i]){ result+=(min-height[i]); } } return result; };
哦还是超时了。百度了一下,思路是先看最高点,然后从两边遍历到中间。
var trap = function(height) { if(height.length<2) { return 0; } var result=0; var maxPosition=height.indexOf(Math.max.apply(Math,height)); var leftMax=height[0]; for(var i = 1; i < maxPosition ; i++){ if(leftMax>height[i]){ result+=leftMax-height[i]; } else{ leftMax=height[i]; } } var rightMax=height[height.length-1]; for(var j=height.length-2;j>maxPosition;j--){ if(rightMax>height[j]){ result+=rightMax-height[j]; } else{ rightMax=height[j]; } } return result; };
AC啦哈哈哈
相关文章推荐
- 在Android Studio中设置或修改默认的Android SDK路径。
- Android 获取ListView中的item控件(mListView.getChildAt(int pos))
- Android 解决ViewPager设置高度为wrap_content无效的方法 MyViewPager
- 安装Genymotion报Unable to load VirtualBox engine错误解决办法
- Android基础复习
- Android 下拉刷新框架实现
- ios读写文件NSFileManager
- Android.mk 文件语法详解
- Android中Handler引起的内存泄露
- android activity进入退出动画自定义
- Android获取一些常用信息
- RTMPdump 命令规范与使用说明
- NDK Application.mk使用手册
- [hadoop] WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- Appium移动自动化测试(一)——安装Appium
- 从网页(包括app中webview)打开APP
- Android-Develop-Resources
- Android Matrix矩阵详解
- unity3d 平滑看向的脚本
- Android的底层库libutils