給出一個矩陣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;
}
}複製代碼