C语言双指针,leetcode: 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 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

提示:

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

算法:

暴力枚举:超时,时间复杂度是O(n^2)

cpp 复制代码
int min(int a,int b)
{
    if(a>b)
    return b;
    else
    return a;
}
int maxArea(int* height, int heightSize) {
    int volume;
    int maxvolume=0;
    int left,right;
    for(left=0;left<heightSize-1;left++){
        for(right=heightSize-1;right>left;right--){
            volume=min(*(height+left),*(height+right))*(right-left);
            if(volume>maxvolume){
            maxvolume=volume;
            }
        }
    }
    return maxvolume;
}

双指针扫描方法

特别是一种称为"夹逼法"或"双指针技巧"的方法。

因为容量最大,我们追去高度高和宽度宽,所以移动宽度时,牺牲高度矮的那个。

这里的主要思想是:

  1. 使用两个指针,一个指向数组的开始,另一个指向数组的末尾。
  2. 计算当前指针位置形成的容器的容量。
  3. 移动指向较短线段的指针,因为这样可能会找到更高的线段,从而可能获得更大的容量。

O(n)时间复杂度

cpp 复制代码
int maxArea(int* height, int heightSize) {
    int maxVolume = 0;
    int left = 0, right = heightSize - 1;
    
    while (left < right) {
        int h = height[left] < height[right] ? height[left] : height[right];
        int w = right - left;
        int volume = h * w;
        
        if (volume > maxVolume) {
            maxVolume = volume;
        }
        
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    
    return maxVolume;
}
相关推荐
幸运超级加倍~10 分钟前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
yannan2019031317 分钟前
【算法】(Python)动态规划
python·算法·动态规划
埃菲尔铁塔_CV算法19 分钟前
人工智能图像算法:开启视觉新时代的钥匙
人工智能·算法
EasyCVR20 分钟前
EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
人工智能·算法·ffmpeg·音视频·webrtc·监控视频接入
linsa_pursuer21 分钟前
快乐数算法
算法·leetcode·职场和发展
小芒果_0122 分钟前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
qq_4340859024 分钟前
Day 52 || 739. 每日温度 、 496.下一个更大元素 I 、503.下一个更大元素II
算法
Beau_Will24 分钟前
ZISUOJ 2024算法基础公选课练习一(2)
算法
XuanRanDev26 分钟前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
gkdpjj28 分钟前
C++优选算法十 哈希表
c++·算法·散列表