zoukankan      html  css  js  c++  java
  • C语言双指针之盛最多水的容器

    题目描述

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

    说明:你不能倾斜容器,且 n 的值至少为 2。

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

    示例

    输入: [1,8,6,2,5,4,8,3,7]
    输出: 49

    题目要求

    int maxArea(int* height, int heightSize){
    
    }

    题解

     1 int max(int a,int b){
     2     return a>b?a:b;
     3 }
     4 int min(int a,int b){
     5     return a<b?a:b;
     6 }
     7 
     8 int maxArea(int* height, int heightSize){
     9     int i=0,j=heightSize-1,count=0;
    10     while(i<j){
    11         if(height[i]>height[j]){
    12             count=max(count,(j-i)*height[j]);
    13             j--;
    14         }else {
    15             count=max(count,(j-i)*height[i]);
    16             i++;
    17         }
    18     }
    19     return count;
    20 }

    暴力解法可以通过但是耗时O(n^2),此算法仅耗时O(n),值得学习参考。

    初始状态是两个指针位于首尾,此时容器的底最大。接下来执行的操作是i++或者j--,无论选择哪个,容器底都会减小,而容器的高度取决于短边,因此为了获取最大的容积,需要放弃短边,也就是说,短边的指针需要往内移动,保留了长边以获得更高边的机会可能。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/container-with-most-water
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    简单工厂笔记
    P3369 【模板】普通平衡树 Treap树堆学习笔记
    tp5阿里云短信验证码
    centos 安装php
    tp6.0.2开启多应用模式
    linux navicat最新版过期
    git commit之后 取消commit
    服务器重置之后ssh root@报错
    git pull push 每次都需要输入账号和密码
    跨域问题 php
  • 原文地址:https://www.cnblogs.com/shi-champion/p/11746757.html
Copyright © 2011-2022 走看看