11. 盛最多水的容器

题目:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2

 1     //方法一:暴力法
 2     //思路:外层循环从第一个元素开始,与内存循环一次比较,乘积计算选取大值
 3     //时间复杂度:n^2    空间复杂度:1
 4     public int containerWithMostWater1(int[] arr) {
 5         if(arr.length < 2) {
 6             throw new IllegalArgumentException("参数输入错误");
 7         }
 8         int len = arr.length;
 9         int result = 0;
10         for(int i=0; i<len-1; i++) {
11             int width = 1;
12             for(int j=i+1; j<len; j++) {
13                 int height = arr[i]; 
14                 if(arr[i] < arr[j]) {
15                     height = arr[j];
16                 }
17                 int temp = width * height;
18                 if(temp > result) {
19                     result = temp;
20                 }
21             }
22         }
23         return result;
24     }
25     //方法二:双指针法
26     //思路:一个指针指向数组头,另一个指针指向数组尾,比较两指针所指元素的大小,小的则继续挪动,大的则停留,每移动一步计算此时的面积
27     //大小,保存已知的最大面积。(大的不动,小的移动,不管谁移动宽度总在减小,但高度取决于小的,如果小的移动将高度提高了,则有可能得
28     //到更大的面积值
29     //时间复杂度:n    空间复杂度:1
30     public int containerWithMostWater2(int[] arr) {
31         if(arr.length < 2) {
32             throw new IllegalArgumentException("参数输入错误");
33         }
34         int result = 0;
35         int left = 0;
36         int right = arr.length -1;
37         int temp = 0;
38         int width = right;
39         while(left < right) {
40             if(arr[left] < arr[right]) {
41                 temp = arr[left] * width;
42                 if(temp > result) {
43                     result = temp;
44                 }
45                 left++;
46             } else {
47                 temp = arr[right] * width;
48                 if(temp > result) {
49                     result = temp;
50                 }
51                 right--;
52             }
53             width--;
54         }
55         return result;
56     }

 

posted @ 2019-05-06 21:51  往南的小燕子  阅读(110)  评论(0编辑  收藏  举报