继续打卡算法题,今天学习的是第LeetCode的第11题盛最多水的容器,这道题目是道中等题,但是我感觉不像中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码能力有一些帮助。
分析一波题目
其实我觉得这个题目很难,因为我一开始想不到它的诀窍。
如果要盛水更多,我们可以想到两点:
- 水柱越高,盛水越多
- 水柱越宽,盛水越多
两根水柱之间盛水的面积公式:
盛水面积 = Min(height[start], height[end]) * (end-start)
如果用穷举法,我们需要对每根水柱都遍历一遍,这样时间复杂度会达到O(n^2)
有没有技巧呢?其实是有的,我们可以想象下从两边往内找,同时有两个指针,如果我们每次只移动短水柱会有什么效果?
短水柱移动可能会导致面积变大,但是不会变小。因此我们可以使用双指针来解决此问题。
编码解决
class Solution {
public int maxArea(int[] height) {
//双指针法,有个规律,只能移动短板才可能导致面积变大,移动长板长度不变或变小,面积一定变小
int res = 0;
int start = 0;
int end = height.length -1;
while(start < end) {
//水槽最大面积由短板面积决定
int t = Math.min(height[start], height[end]) * (end - start);
res = Math.max(res, t);
//移动短板
if(height[start] < height[end]) {
start++;
} else {
end--;
}
}
return res;
}
}
总结
很多算法类题目其实是有一些技巧性的解法的,如果靠暴力方法解决性能极低,通过一个技巧提升性能,我想这种技巧应该还是要多实践,多写,多思考,多积累,我相信一定可以积累一些解决技巧的。