MarsCode青训营打卡Day1(2025年1月14日)|稀土掘金-16.最大矩形面积问题

资源引用:

最大矩形面积问题 - MarsCode

打卡小记录:

今天是开营第一天,和小伙伴们组成了8人的团队,在接下来的数十天里相互监督,打卡刷题!

稀土掘金-16.最大矩形面积问题(16.最大矩形面积问题)

题目分析:

这是一道双指针问题。

给定一个有n个元素的array数组,其中的每一个元素都代表一个高度。

现要求从array数组中任意选取k个相邻元素,定义它们所形成的最大矩形面积R(k) = k * min(k个元素)。

题目重点:

用双指针法,由于k是任意的不大于n的正整数,则需要遍历的对象就是该array数组的全部连续子数组,利用左右指针确定子数组的边界。

解题思路:

  • 初始化最大值res用于记录最大的R(k)
  • 初始化左右指针left和right作为连续子数组的左右边界(若使用Arrays.copyOfRange方法,注意左闭右开)。
  • 使用双指针法遍历array数组的全部连续子数组,并计算每一个连续子数组的R(k)值,和当前的最大值res比较并更新res
    • 为计算每一个连续子数组的R(k)值,还需知道当前连续子数组中的最小元素,为此还需增加一个minHeight变量用于记录最小元素
    • 增加一个Rk用于计算当前连续子数组的R(k)
  • 最终返回res
public class Main {
    public static int solution(int n, int[] array) {
        int res = 0;
        for (int left = 0; left < n; left++) {
            int minHeight = array[left];// 记录当前子数组的最小元素
            int Rk = 1 * minHeight;/* 记录当前子数组的R(k) */ 
            res = Rk > res ? Rk : res;
            for (int right = left + 1; right < n; right++) {
                minHeight = array[right] < minHeight ? array[right] : minHeight;// 更新最小元素
                Rk = (right - left + 1) * minHeight;// 计算当前子数组的R(k)
                res = Rk > res ? Rk : res;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(solution(5, new int[]{1, 2, 3, 4, 5}) == 9);
    }
}

你可能感兴趣的:(MarsCode青训营,算法,java)