zoukankan      html  css  js  c++  java
  • Leetcode 11. 盛最多水的容器 双指针

    地址  https://leetcode-cn.com/problems/container-with-most-water/

    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。
    在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器。 示例 1

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49 
    解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
    
    示例 2:
    输入:height = [1,1]
    输出:1
    
    示例 3:
    输入:height = [4,3,2,1,4]
    输出:16
    
    示例 4:
    输入:height = [1,2,1]
    输出:2

    提示:

    • n = height.length
    • 2 <= n <= 3 * 104
    • 0 <= height[i] <= 3 * 104
     

    解答

    朴素想法是进行暴力遍历 逐个尝试每两条线的组合 求出面积 得到最大的组合 复杂度O(n2)

    由于盛水的两端是由较矮的那端决定,所以考虑使用双指针从两端向中心移动,每次移动较矮的那端以做其他的线段尝试。 复杂度O(n)

    如图

    代码

    class Solution {
    public:
    int ans = -1;
    int maxArea(vector<int>& height) {
        int l = 0; int r = height.size() - 1;
        while (l < r) {
            ans = max(ans, min(height[l], height[r])*(r - l ));
            if (height[l] <= height[r]) { l++;  }
            else {  r--; }
        }
        return ans;
    }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    声明式事务编程
    PlatformTransactionManager
    编码式事务
    事务的ACID
    struts2的工作原理
    通过Callable接口实现多线程
    Struts2 标签
    Struts2基础
    MySQL性能优化(十)-- 主从复制(一主多从)
    JVM学习(一)
  • 原文地址:https://www.cnblogs.com/itdef/p/14509840.html
Copyright © 2011-2022 走看看