5130-等價多米諾骨牌對的數量

前言

Weekly Contest 146等價多米諾骨牌對的數量數組

給你一個由一些多米諾骨牌組成的列表 dominoesdom

若是其中某一張多米諾骨牌能夠經過旋轉 0 度或 180 度獲得另外一張多米諾骨牌,咱們就認爲這兩張牌是等價的。ui

形式上,dominoes[i] = [a, b]dominoes[j] = [c, d] 等價的前提是 a==cb==d,或是 a==db==c設計

0 <= i < j < dominoes.length 的前提下,找出知足 dominoes[i]dominoes[j] 等價的骨牌對 (i, j) 的數量。code

示例:leetcode

輸入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
輸出:1

提示:get

  • 1 <= dominoes.length <= 40000
  • 1 <= dominoes[i][j] <= 9

解題思路

一開始我是試了一下暴力破解這個方法,惋惜運行超時,只好另想它法了。test

後續參考了Java中的HashMap的位桶的設計,思路以下:遍歷

  1. 數字result表示等價的骨牌對個數,數組arr表示多米諾骨牌出現的次數,其中數組下標i(假設骨牌dominoe=[a,b],則i=a*10+b)表示對應的多米諾骨牌,arr[i]表示該骨牌出現的次數
  2. 遍歷多米諾骨牌列表dominoes,對於每一個骨牌dominoe,假設dominoe=[a,b],而後按照如下邏輯處理方法

    1. 使用a*10+b計算出旋轉0度時在arr的下標index1;使用b*10+a計算出旋轉180度是在arr的下標index2
    2. 若是index1等於index2,即表示dominoea等於b,此時result增長arr[index1],同時arr[index1]的值自增(避免多累加一次)便可
    3. 若是index1不等於index2,即表示dominoea不等於b,此時result增長arr[index1],同時arr[index1]arr[index2]都自增。

實現代碼

暴力破解

暴力破解的方法會出現運行超時的狀況,這個是一個錯誤的示例,列出來給你們參考一下。

/**
     * 5130. 等價多米諾骨牌對的數量
     * 暴力破解法
     * @param dominoes
     * @return
     */
    public int numEquivDominoPairs(int[][] dominoes) {
        int result = 0;
        for (int i = 0; i < dominoes.length; i++) {
            int a = dominoes[i][0];
            int b = dominoes[i][1];
            for (int j = i+1; j < dominoes.length; j++) {
                int c = dominoes[j][0];
                int d = dominoes[j][1];
                if((a==c && b==d) || (a==d && b==c)){
                    ++result;
                }
            }
        }
        return result;
    }

有效解答

/**
     * 5130. 等價多米諾骨牌對的數量
     *
     * @param dominoes
     * @return
     */
    public int numEquivDominoPairs(int[][] dominoes) {
        int result = 0;
        // 因爲1 <= dominoes[i][j] <= 9,因此最大值不會超過99
        int[] arr = new int[100];
        for (int i = 0; i < dominoes.length; i++) {
            // 以ij形式表示骨牌對(i,j),這個是翻轉0度(即自己)
            int index1=dominoes[i][0]*10+dominoes[i][1];
            // 翻轉180度後
            int index2=dominoes[i][1]*10+dominoes[i][0];
            if(index1 == index2){ // i==j,只要累加一次便可
                result+=arr[index1];
                arr[index1]++;
            }else{
                result+=arr[index1];
                arr[index1]++;
                arr[index2]++;
            }
        }
        return result;
    }
相關文章
相關標籤/搜索