力扣练习之盛最多水的容器

这道题其实最简单的方法是用双重循环,但它有一个坏处是时间复杂度非常高,O(n²),所以会超时,为了改良时间复杂度,所以采用了双指针的办法来进行解决

题目:

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

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

 用双指针的话,分别用left和right来指向数组的首部和尾部,至于容器能够容纳的的水容量其实是木桶效应,简单点来说是由最短的那根木板来决定了它最多能容纳的容量(底部如果确定的话)

所以在这道题中容量rong=(right-left)*min(height[left],height[right]);

然后因为要找出最大的容量,所以我们就要遍历该数组,找到尽可能长的高度,因为只有这样,才有可能比现有的容量rong所能容纳的水多,如果越找越少的话,那容量肯定会变少(因为宽变短了,高也变短了),所以如果height[left]

这时候如果新的容量大于原有的容量的话,那么就替换它,否则不变,如此循环,直到left

代码

// #include
// class Solution {
// public:
//    //双重循环,超时
//     int maxArea(vector& height) {
//         //大体思路就是假设两个索引是i和j,则他们的体积就是(j-i)*min(height[i],hight[j]);
//         int len=height.size();
//         int rong=0;//初始化
//         for(int i=0;i
class Solution{
public:
    int maxArea(vector& height){
        int len=height.size();
        int left=0;
        int right=len-1;
        int rong=0;//初始化
        while(left

你可能感兴趣的:(力扣练习题,leetcode,算法,职场和发展)