力扣

解释:给定数组nums,求Max( min(nums[i],nums[j])*(j-i) ), 0<=i<j<nums.size() 


目录

双指针

简单证明:

小技巧

1.对撞双指针

2.求最值


双指针

两个指针i,j指向数组首位

简单证明

不失一般性,假设nums[i]<nums[j]

如果移动右指针j,则底也变小,高可能变小可能不变,面积不可能变大。

所以只能移动i,及每次移动对应数值小的指针

class Solution {
public:
    int maxArea(vector<int>& height) {
int n=height.size();
int i=0;
int j=n-1;
//双指针指向数组首尾

int max_content=(j-i)*min(height[j],height[i]);
int max_temp;//循环中求最大值



while(i<j)
{
    if(height[i]<height[j])
    {
        i++;
        max_temp=(j-i)*min(height[j],height[i]);
        max_content=max(max_temp,max_content);
    }
    else
    {
        j--;
         max_temp=(j-i)*min(height[j],height[i]);
        max_content=max(max_temp,max_content);
    }
}
return max_content;
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

小技巧

1.对撞双指针
int i=0;
int j=max_index;
//移动双指针直至相遇
while(i<j)
{
   ...
   i++;
   ...
   j--;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
2.求最值
int max_res=0//定义最大值
int max_temp;//定义每步最大值
循环
{
操作;
更新max_temp;
max_res=max(max_temp,max_res);
}


//最小值类似
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.