题解 | #接雨水问题#

接雨水问题

http://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f

我的解法是一层一层的解,但是不知道为啥就是耗时的不得了
逻辑是柱子序号入栈,当发现比栈顶大时出栈,出栈的做桶底,如果出空了就不处理,
如果出完栈里还有值就按当前值跟栈顶其较小,减去桶底后乘以宽度。

public long maxWater(int[] arr) {
        // write code here
        //栈里存序号
        Stack<Integer> indexs = new Stack<>();
        Long res = 0L;
        for (int i = 0; i < arr.length; i++) {
            int cur = arr[i];
            if (indexs.isEmpty()) {
                indexs.add(i);
            } else {
                if (cur == arr[indexs.peek()]) continue;
                while (!indexs.isEmpty()) {
                    if (cur < arr[indexs.peek()]) {//不保存重复
                        indexs.add(i);
                        break;
                    } else {
                        int left = indexs.pop();
                        int floor = arr[left];
                        if (indexs.isEmpty()) {
                            indexs.add(i);
                            break;
                        }
                        int trueHeight = Math.min(cur - floor, arr[indexs.peek()] - floor);
                        int w = i - indexs.peek() - 1;
                        res += Long.parseLong(trueHeight + "") * Long.parseLong(w + "");
                    }
                }
            }
        }
        return res;
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 14:10
啊啊啊啊好幸福,妈妈是我找工作发疯前的一束光
榕城小榕树:你是我见过最幸福的牛客男孩
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 12:10
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:10
直接上图
牛客13578115...:改得一般,不值80
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务