美团一面算法题

873 阅读2分钟

美团一面算法题回忆

**** 马上入职一个月了,年终总结回忆一下面试笔试流程。 当时面的是美团到店事业群-平台技术部-大数据开发岗,技术面总共2面,HR一面,最后拿到一个SP。

面试:自我介绍,主要是说项目,我主要说了在去哪儿网实习的3个月所做的工作,另外简单介绍了一篇论文。 随后面试官就展开问项目,大概问了10分钟,接下来就Hadoop、Spark、Kafka这几个框架详细问,问题基本都是常规的。面试进行到大约40分钟的时候开始说,进行一个在线算法题。面试官说出个简单的吧,结果发出来就有一点懵了(LeetCode原题 求二维数组中由1组成的最大矩形)。因为前几天刚做了一个最大正方形,所以就直接说,用动态规划的方法做。随后写代码,写的过程中发现和求最大矩形很不同,难度应该是增加了一个等级,写了半天没写出来求长宽的这个比较过程。

随后,面试官开始引导,他问做过接雨水的题吗。我回答说做过,他说把这个接雨水的思路借鉴过来,求矩形的高度,宽度好解决。捣鼓了几分钟后,发现有点眉目,进过面试官再引导一次写出了代码。

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(matrix == null || matrix.length == 0)
            return 0;
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j] == '1')
                    dp[i][j] = 1;
            }
        }
        //统计每一个方格对应的高度
        for(int i=1;i<m;i++){
            for(int j=0;j<n;j++){
                if(dp[i][j] == 1)
                    dp[i][j] = dp[i-1][j] + 1;
            }
        }
        int res = 0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(dp[i][j] == 0)
                    continue;
                int curHeight = dp[i][j];
                for(int k=j;k>=0&&dp[i][k]>0;k--){
                    int curWidth = j-k+1;
                    curHeight = Math.min(curHeight, dp[i][k]);
                    res = Math.max(res, Math.max(dp[i][k], curHeight*curWidth));
                }
            }
        }
        return res;
    }
}

写完后,面试已经进行了1小时10分钟,面试官问有什么问题问他,我也就很常规地问了问业务线,平时工作是什么方向等等。面试官是我秋招以来态度最平和,语气最温柔的。随后说“今天就到这里吧”。一面结束。