盛最多水的容器——数组专题
思路:
- 双指针,p指针指向数组第一个数,q指针指向数组最后一个数,用一个变量记录最大雨水量
- 计算当前雨水量,若比最大雨水量大,更新最大雨水量。如果nums[p]<nums[q],p往里移一位(p++),反之q往里移一位(q–)
- 重复上一步操作,直至两指针相遇,返回最大雨水量
重点:
小伙伴一定有疑问,为什么nums[p]<nums[q],p往里移一位(p++),反之q往里移一位(q–)就可以覆盖到所有可能是最大雨水量的结果呢???
反证法,假设数组的最大雨水量出自组合(p,q),是由(p-1,q)且nums[p-1]>=nums[p]转移来的,显然min(nums[p-1],nums[q]) ×(q-(p-1)
)的雨水量要大于最大雨水量min(nums[p],nums[q] )×(q-p)),与假设相悖,另一种情况(p,q+1)同理。所以nums[p]<nums[q],p往里移一位(p++),反之q往里移一位(q–)就可以覆盖到所有可能是最大雨水量的结果!!!
代码见力扣题解,思路更为重要!!!