leetcode第11题

简介: 我们理一下思路,大小是由长度和高度决定,如果选 0 到 8 就保证了长度最长,此时大小是 0 号柱子的高度 1 乘以长度 8 。我们如果想面积更大怎么做呢,只能减小长度,增加高度。是左边的柱子向右移动变成 1 号柱子呢?还是右边的柱子向左移动变成 7 号柱子呢?当然是哪边的柱子短就改哪边的!只有这样,高度才有可能增加。例如我们如果把 8 号柱子变成 7 号柱子,此时长度减少了,然而高度还是 0 号柱子没有变化,所以面积就会减少。把 1 号柱子变成 2 号柱子就很好了,因为此时高度就变成了 8 号柱子的高度,面积就有可能会增加。如果左右两边柱子相等该怎么办呢?随意!我们假设 1 号

image.png

top11

每个数组代表一个高度,选两个任意的柱子往里边倒水,能最多倒多少水。

解法一 暴力解法

直接遍历任意两根柱子,求出能存水的大小,用一个变量保存最大的。

publicintmaxArea(int[] height) {
intmax=0;
for (inti=0; i<height.length; i++) {
for (intj=i+1; j<height.length; j++) {
inth=Math.min(height[i], height[j]);
if (h* (j-i) >max) {
max=h* (j-i);
            }
        }
    }
returnmax;
}

时间复杂度:O(n²)。

空间复杂度:O(1)。

解法二

我们理一下思路,大小是由长度和高度决定,如果选 0 到 8 就保证了长度最长,此时大小是 0 号柱子的高度 1 乘以长度 8 。我们如果想面积更大怎么做呢,只能减小长度,增加高度。是左边的柱子向右移动变成 1 号柱子呢?还是右边的柱子向左移动变成 7 号柱子呢?当然是哪边的柱子短就改哪边的!只有这样,高度才有可能增加。

例如我们如果把 8 号柱子变成 7 号柱子,此时长度减少了,然而高度还是 0 号柱子没有变化,所以面积就会减少。把 1 号柱子变成 2 号柱子就很好了,因为此时高度就变成了 8 号柱子的高度,面积就有可能会增加。

如果左右两边柱子相等该怎么办呢?随意!

我们假设 1 号 和 8 号 柱子高度是相等的。如果他们之间的柱子只有 1 根比它俩高或者没有比它俩高的,那么最大面积就一定选取是 1 号和 8 号了,所以 1 号接着变大,或者 8 号接着减小都是无所谓的,因为答案已经确定了。

假设 1 号 和 8 号之间有 2 根或以上的柱子比它俩高,假设是 4 号和 6 号比它俩高。1 号会变到 2 号、3 号,最终为 4 号,8 号会变到 7 号, 6 号,而在这个过程中产生的面积一定不会比 1 号和 8 号产生的面积大,因为过程中的柱子都比 1 号和 8 号低。所以是先变 1 号还是先变 8 号是无所谓的,无非是谁先到达更长的柱子而已。

看一下下边的算法,会更加清楚一些。

publicintmaxArea2(int[] height) {
intmaxarea=0, l=0, r=height.length-1;
while (l<r) {
maxarea=Math.max(maxarea, Math.min(height[l], height[r]) * (r-l));
if (height[l] <height[r])
l++;
elser--;
    }
returnmaxarea;
}

时间复杂度:O(n)。

空间复杂度:O(1)。

总结

为了减少暴力解法的时间复杂度,只能去深层次的理解题意,从而找出突破点。

相关文章
|
4月前
leetcode-1447:最简分数
leetcode-1447:最简分数
42 0
|
4月前
leetcode-472. 连接词
leetcode-472. 连接词
41 0
|
4月前
|
C++ Python
leetcode-283:移动零
leetcode-283:移动零
26 0
单链表反转 LeetCode 206
单链表反转 LeetCode 206
69 0
leetcode 283 移动零
leetcode 283 移动零
50 0
|
存储
leetcode第57题
和上一道可以说是一个问题,只不过这个是给一个已经合并好的列表,然后给一个新的节点依据规则加入到合并好的列表。 解法一 对应 56 题的解法一,没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题没看的话,可以先过去看一下。这个问题其实就是我们解法中的一个子问题, 所以直接加过来就行了
leetcode第57题
leetcode第44题
时间复杂度:text 长度是 T,pattern 长度是 P,那么就是 O(TP)。 空间复杂度:O(TP)。 同样的,和第10题一样,可以优化空间复杂度。
leetcode第44题
|
算法
leetcode第47题
基本上都是在上道题的基础上改出来了,一些技巧也是经常遇到,比如先排序,然后判断和前一个是否重复。利用 Hash 去重的功能。利用原来的存储空间隐藏掉数据,然后再想办法还原。
leetcode第47题
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
leetcode第42题