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;
    }
}複製代碼
相關文章
相關標籤/搜索