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;
}
相关推荐
Navigator_Z26 分钟前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚2 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木2 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
是隼人2 小时前
buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
这料鬼有毒4 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃4 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm
Logic1015 小时前
C语言/数据结构贪心算法题解:买卖股票的最佳时机——一次交易最大利润(O(n)时间O(1)空间)
c语言·数据结构·贪心算法·数组·时间复杂度·算法题·股票交易
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出货币交易中的“独特面值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
GreenTea6 小时前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法
庖丁解牛7 小时前
无穷小不是一个“神秘小数”,而是一场奔向 0 的过程
算法