盛最多水的容器题目的大概意思就是输入一个数组 然后把这个数组抽象为一个坐标系横坐标是数组索引纵坐标是值比如输入4 2 1 8 - (0,4) (1,2) (2,1) (3,8)这几个离散点 然后题目要求求出开这几个离散点的横坐标与纵坐标围成面积的最大值这个题目可能比较两极分化想到思路的可能会觉得比较简单想不到的就觉得比较抽象其实算法题嘛 五分钟内想不到思路就可以看题解了或者问ai了 看了思路之后自己写一遍积累一下这种算法的思维这题最简单的思路就是双指针了结合这个图来看比如这样一个示例 让一个指针指向数组最左边 一个指针指向数组最右边然后比较高度来让这个范围逐渐逼近 定义一个全局maxArea变量来记录逼近过程中最大的面积我要求最大嘛 所以我们肯定是想寻求一个高度更大的柱子对不对所以就是左边如果比右边小 我们就让left(右移) 否则就让right--(左移)终止条件就算两个指针重合 这个时候面积就是最小的 其实都已经不存在如果输入时上面的例子 就算right指向8可以一直不动 指向left的一直往右移动每移动一次就记录面积最后只返回最大的面积这个地方一定要认为height[left]height[right]去left你要想你想保证水最多 是不是要线最高 那比较两边的线的高度 那肯定时低的那一边动啊 如果高的东的话 就不一定是最大的面积了所以移动的原则肯定是比较两条边哪边小哪边就往中间靠import java.util.Scanner; ​ public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); String s sc.nextLine(); String[] split s.split( ); int [] arrnew int[split.length]; for(int i0;isplit.length;i){ arr[i]Integer.parseInt(split[i]); } int i maxArea(arr); System.out.println(i); } public static int maxArea(int[] height) { //定义两个指针 分别指向数组的两端 int left0; int rightheight.length-1; int maxArea0; while(leftright){ maxArea Math.max(maxArea, (right - left) * Math.min(height[left], height[right])); if(height[left]height[right]){ left; }else{ right--; } } return maxArea; } }​