1.Algorithm:https://leetcode-cn.com/problems/container-with-most-water/
盛水最多的容器
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
可以暴力遍历,比较巧的方法是利用双指针,一个指向数组开头,一个指向数组的尾端。开始计算盛水量,比较这两个位置的数值大小,哪个方向的数值小,则向中间移动一步,知道两个指针相遇。
参考代码如下:
//leetcode 11
public class MostWater {
public int maxArea(int[] height) {
int res = 0;
if (height == null || height.length == 0) {
return 0;
}
for (int i = 0; i < height.length; ++i) {
for (int j = i + 1; j < height.length; ++j) {
int area = Math.min(height[i], height[j]) * (j - i);
res = Math.max(res, area);
}
}
return res;
}
public int maxAreaTwoPoint(int[] height) {
int res = 0;
if (height == null || height.length == 0) {
return 0;
}
int i = 0;
int j = height.length - 1;
while (i < j) {
int area = Math.min(height[i], height[j]) * (j - i);
res = Math.max(res, area);
if (height[i] < height[j]) {
i++;
} else {
j--;
}
}
return res;
}
}
2.Review:https://shipilev.net/jvm/anatomy-quarks/8-local-var-reachability/
本地变量的可访问性
在C++里,本地变量在它的句法作用域里是一直有效的。在java中是这样的吗?
离开了当前作用域,存储在局部变量中的引用才会被回收,这种说法正确吗?在Java中并非如此,Java局部变量的可用性不由代码块决定,而与最后一次使用有关,并且可能会持续到最后一次使用为止。使用像finalizer、强引用、弱引用、虚引用这样的方法通知对象不可达,会受到“提前检查”优化带来的影响,使得代码块还没有结束变量可能已不可用,这是一种很好的特性,使得GC能提前回收掉本地分配的大量缓存
当然如果想获得C++编程那种代码块结束时才释放的特性,你可以使用try-finally
3.Tip:继续学习相关linux编程的知识。
4.share: https://mp.weixin.qq.com/s/mobYyu69oLUTvkRNPbPD1A
专栏 数据结构与算法之美的作者王争的文章,挺喜欢其中的话,
成年人的突然优秀,都是深谋远虑之后的正常发挥