LintCode题解|Microsoft 面试题:Matrix Finding Number


九章算法 | Microsoft 面试题:Matrix Finding Number

题目描述

给出一个矩阵mat,找出全部行都出现的数字,若是有多个,就输出最小的那个数。若是没有,输出-1面试

思路点拨

用hashmap维护每一个数最后出现的行数,最后在扫一遍hashmap取最小便可。算法

考点分析

本题对每行去暴力寻找有哪些数出现,显然不可取。咱们能够换一个思惟,对每一个数x维护该数最后出现的行数,若是遍历到第i行,发现x的最后出现的行数不是i-1,那么咱们就能够舍去这个数了,最后遍历一遍全部的数出现的行数是否为n便可。思惟的转变尤为重要,本题也突出了MS的特点。bash

九章参考程序

www.jiuzhang.com/solution/ma…网站

/**
* 本参考程序来自九章算法,由 @斌助教 提供。版权全部,转发请注明出处。
* - 九章算法致力于帮助更多中国人找到好的工做,教师团队均来自硅谷和国内的一线大公司在职工程师。
* - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
* - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
* - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
*/ 

public class Solution {
    /**
     * @param mat: The matrix
     * @return: The answer
     */
    Integer min(Integer a, Integer b) {
        if(a < b)
            return a;
        else 
            return b;
    }
    public int findingNumber(int[][] mat) {
        // Write your code here
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
        for(int i = 0; i < mat.length; i++) {
            for(int j = 0; j < mat[i].length; j++) {
                if(map.containsKey(mat[i][j])) {
                    if(map.get(mat[i][j]) == i - 1) {
                        map.put(mat[i][j], i);
                    }
                }
                else {
                    if(i == 0) {
                        map.put(mat[i][j], 0);
                    }
                }
            }
        }
        Integer ans = 10007;
        for (Map.Entry<Integer, Integer> it : map.entrySet()) {
            if(it.getValue() == mat.length - 1) {
                ans = min(ans, it.getKey());
            }
        }
        if(ans == 10007)
            ans = -1;
        return ans;
    }
}复制代码
相关文章
相关标签/搜索