换个方向可能更简单---在力扣的成长(三)
2019-11-20 16:02:23来源:博客园 阅读 ()
换个方向可能更简单---在力扣的成长(三)
算法解题地址:https://leetcode-cn.com/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/
这个是真的牛比,当看到这个解决方法时,我惊了,我的初始想法是通过柱子的变化趋势去找到所有的凹槽,然后用Math.min(left,right)*(rx-lx-1)-(中间的圆柱的体积)得到每个凹槽装水的体积,然后进行累加得到盛水的总体积,这种思路真的是太直了,直得一点弯都不转的,而且这种解法不适用于最后一个凹槽的情况。可能是看到题目的缘故把,让我直接想算所有凹槽盛水的体积。这个大神将这个题目完全转化成了几何问题,将整个分解成了每一行来算,将这个看起来极其复杂的问题转化成了一个很简单的问题,太厉害了。有的时候题目可能是最能迷惑人的地方,将我们的思路强行移动到一个方向,但这个方向可能很麻烦,如果说这个题目的问题是
求蓝色区域的面积,我们可能很想的简单一些。所以说,不要总是停留在自己的世界里面了,多去看看其他人的想法可能会给你的编程带来帮助,你的脑袋也会更加活跃一些吧。
以下是个人写的代码,如果有大佬帮忙给看一下,谢谢:
package test;
/*
* 本程序的基本思想
* 通过柱子的变化趋势分别确定凹槽的左边界和右边界
*只遍历一遍柱子高度
*该程序的过程
*判断左边界,左边界确定判断右边界,最后将按照Math.min(left,right)*(rx-lx)-(中间的圆柱的体积)计算处
*凹槽中盛水的体积
*/
public class RainWater {
public static void main(String[] args) {
//柱子的高度
int [] height=new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
//左指针,用来记录凹槽的左边
int left=0;
//右指针,用来记录凹槽的右边
int right=0;
//游标 作为程序结束的条件
int cursor=1;
//柱子的个数,用来判断游标是否遍历到数组最后
int size=height.length;
//凹槽装水的总体积
int sum=0;
while(cursor<size) {
//1、判断左边界
if(height[left]<=height[cursor]) {
//a、没有变化趋势或者是上升趋势,那么这个柱子不能作为左边界,所以,将左边界向右移动
left++;
//b、游标向右移动
cursor++;
//c、进行下一次循环
continue;
}
else {
cursor++;
//a、说明有成为左边界的趋势,如果中间小于左边,直到找到一个>=左边界的边作为右边界,每一次while循环找到一
//b、凹槽,并计算面积
while(cursor<size&&height[left]>height[cursor]) {
cursor++;
}
//c、当while循环调处时,判断是否因为遍历到最后找不到导致循环跳出
if(cursor==size) {
break;
}
else {
//d、找到了右边界,采用公式计算出当前凹槽的体积
right=cursor;
sum+=height[left]*(right-left-1)-getSum(0,left,right,height);
System.out.println("凹槽边界["+left+","+right+"],体积为"+(height[left]*(right-left-1)-getSum(0,left,right,height)));
//d、将左右边界重置,游标+1
left=right=cursor;
cursor++;
//e、寻找下一个凹槽,并计算凹槽体积
continue;
}
}
}
System.out.println("装水的总体积为"+sum);
}
public static int getSum(int sum,int left,int right,int [] height) {
// int sum=0;
for(int i=left+1;i<right;i++) {
sum+=height[i];
}
return sum;
}
}
原文链接:https://www.cnblogs.com/heibo/p/11898426.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:写一个java常用的加密工具类
- 这可能是目前最透彻的Netty讲解了... 2020-06-08
- Java工程师月薪17010元:方向不对,努力也白费 2020-05-29
- 还搞不定Java多线程和并发编程面试题?你可能需要这一份书单 2020-05-18
- 还搞不定Java多线程和并发编程面试题?你可能需要这一份书单 2020-05-15
- 可能是把 Java 接口讲得最通俗的一篇文章 2020-05-15
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash