Leetcode:835. 圖像重疊

直接找出全部1的位置,而後對兩個矩陣的全部這些位置進行求差。而後統計這些差出現最多的次數是多少。git

兩個座標的差是什麼含義?就是把其中一個座標移動到另外一個座標須要移動的向量。所以,在遍歷過程當中,咱們找出了A中全部值爲1的座標移動到B中全部值爲1的座標須要移動的向量。那麼,在這些向量中出現次數最多的向量就是咱們要求的整個矩陣應該移動的向量。這個向量出現的次數,就是咱們向該向量方向移動了以後,能重疊的1的個數。github

寒神的作法的優勢:第一,注意到了題目給的A和B是大小相等的正方形!第二,遍歷正方形的方式使用的是i在[0,NN]區間裏,而後 [i/N][i%N] 這個求位置方法,能夠把兩重循環簡寫成一重(可是時間複雜沒有變化)。第三,使用了數字表示向量,即把一個向量的行數100+列數,好比第13行第19列,能夠用一個數字表示1319。寒神告訴咱們,這個100的選擇是由於過小的話不能有效區分,應該最小是2N。ide

public int largestOverlap(int[][] A, int[][] B) {
    int N = A.length;
    List<Integer> LA = new ArrayList<>();
    List<Integer> LB = new ArrayList<>();
    HashMap<Integer, Integer> count = new HashMap<>();
    for (int i = 0; i < N * N; ++i) if (A[i / N][i % N] == 1) LA.add(i / N * 100 + i % N);
    for (int i = 0; i < N * N; ++i) if (B[i / N][i % N] == 1) LB.add(i / N * 100 + i % N);
    for (int i : LA) for (int j : LB)
            count.put(i - j, count.getOrDefault(i - j, 0) + 1);
    int res = 0;
    for (int i : count.values()) res = Math.max(res, i);
    return res;
}
相關文章
相關標籤/搜索