前言
各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)
一、盛水最多的容器
1, 题目
2, 思路分析
最简单的暴力枚举 : 两层 for 循环, 从左往右依次尝试两个数, 最后形成的容积, 时间复杂度为O(N * N), 会超出时间限制
既然暴力枚举不行, 那尝试就使用双指针, 一个 left , 一个 right
根据实际情况分析选择对撞双指针还是快慢双指针, 本题的结果和 “宽度” 有关系, 所以初始时, 尽可能让宽度最大, 这正好是使用 对撞双指针 的机会
而且刚才标注了一句话 : 查找的本质是排除, 查找的本质是排除, 查找的本质是排除 ! ! !
如果每次判断, 都能尽可能多的排除数据, 就能尽可能地提高效率
如上图所示, 初始时, left 和 right 指针分别定义在数组两端, 进行简单地分析就能判断下一步是 left++ 还是 right–(固定值较大的指针, 让较小的指针向内遍历)
, 这样就能排除一趟暴力枚举时需要遍历的数据
3, 代码展示
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int max = 0;
int content = 0;
while(left < right){
int shorter = Math.min(height[left], height[right]);
content = (right - left) * shorter;
max = Math.max(max, content);
if(height[left] >= height[right]) {
right--;
}else {
left++;
}
}
return max;
}