力扣打卡:11. 盛最多水的容器
解题思路
结合双指针的题目再次体会到了,如果想要优化,那么尽量找出题目所给的条件
-
一定要理清楚题目给出的条件和使用的解题方法,有什么关联
-
如双指针,不要仅仅只是盯着
left
和right
的位置变化,更应该关注的是left
和right
的含义
-
例如在此道题中,本身
left
和right
位置变化没有多大的意义,但是left
和right
代表的是 短板和高板 是谁移动了的含义 -
我们确定了短板影响面积的大小
(条件)
,所以应该考虑的是left
和right
代表的板子哪一个短,而不是考虑left
和right
位置本身的含义 -
这也是经常找不到优化题目的原因,一直理不清楚使用的变量和代表的含义的关系
-
优化的方向是:找到这个变量和题目所给条件的关系,而不仅仅只是盯着这个变量
值/位置
的变化,更应该关注的:其代表的含义
代码
class Solution {
public int maxArea(int[] height) {
// 初始化指针为left=0,right=height.length-1
// 优化的关键是给出的隐含的条件,面积取决于短板,应该在这里做文章,这是一个优化的方向
// 重点:因为面积取决于left和right哪一个短 和 right-left 的大小
// 在两个已知的数字中,
// 如果大的往内走,那么一定会导致面积的减小,因为小的值固定,两者的距离也靠近,那么min*(right-left)一定减小
// 如果小的往里走,那么面积的值可能增大,因为大的值固定了,往里走可能出现 原来 min 的值开始增大的情况,即出现比原来min大的数
int left=0, right=height.length-1;
int max = (right-left) * Math.min(height[left],height[right]);
while(left<right){
int width = right-left;
max = height[left]<height[right] ?
Math.max(max,width * height[left++]) :
Math.max(max,width * height[right--]);
}
return max;
}
}
总的来说是
- 优化的方向很大的可能就是题目给出的隐含条件
- 此题给出的条件就是 面积是取决于短的一个板,所以分析短的板移动和高的板移动会造成什么影响
- 使用双指针,应该要结合要分析的条件,不要仅仅只是盯着left和right的位置变化,而应该再加上left和right的含义是否有变化了
- 使用双指针一定要注意的是不要仅仅只是盯着left和right的位置变化,更重要的是盯着left和right的含义,和题目的条件有什么关联的地方
- 想要优化复杂度,一般就往题目的条件进行靠拢,使用left和right的有关信息与题目进行关联,而不仅仅是盯着left和right的位置变化