力扣-11蓄水最多问题-双指针
方法一:直接for循环
时间复杂度为O(n2)
优点:简单
缺点:效率太低
public static int maxArea1(int[]height){
int max=0;
int area=0;
for (int i=0;i<height.length-1;i++){
for (int j=i+1;j< height.length;j++){
area=(j-i)*Math.min(height[i],height[j]);
max=area>max?area:max;
}
}
return max;
}
虽然该代码中已经将for循环优化了,次数未n2\2,但是复杂度仍然是O(n2)
方法二:双指针
时间复杂度:O(n)
相比方法一,这种方法复杂度直接下降一个数量级
public static int maxArea2(int[]height){
// 设置双指针
int i=0;
int j=height.length-1;
// 当前蓄水量
int res=0;
// 最大蓄水量
int maxRes=0;
while (i<j){
res=height[i]<height[j]?(j-i)*Math.min(height[i++],height[j]):(j-i)*Math.min(height[j--],height[i]);
maxRes=res>maxRes?res:maxRes;
}
return maxRes;
}
思想:res=(j-i)*min(height[i],height[j])
蓄水量是由短的那根板决定的,
移动木板会使宽度下降,
所以,如果移动长的木板,高度不变,宽度减小,蓄水量变小;只有移动短的木板,使木板变长才有可能使蓄水量增大
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界