力扣貪心 1007. 行相等的最少多米諾旋轉

在一排多米諾骨牌中,A[i] 和 B[i] 分別代表第 i 個多米諾骨牌的上半部分和下半部分。(一個多米諾是兩個從 1 到 6 的數字同列平鋪形成的 —— 該平鋪的每一半上都有一個數字。)

我們可以旋轉第 i 張多米諾,使得 A[i] 和 B[i] 的值交換。

返回能使 A 中所有值或者 B 中所有值都相同的最小旋轉次數。

如果無法做到,返回 -1.

 

示例 1:

輸入:A = [2,1,2,4,2,2], B = [5,2,6,2,3,2]
輸出:2
解釋:
圖一表示:在我們旋轉之前, A 和 B 給出的多米諾牌。
如果我們旋轉第二個和第四個多米諾骨牌,我們可以使上面一行中的每個值都等於 2,如圖二所示。
示例 2:

輸入:A = [3,5,1,2,3], B = [3,6,3,3,4]
輸出:-1
解釋:
在這種情況下,不可能旋轉多米諾牌使一行的值相等。
 

提示:

1 <= A[i], B[i] <= 6
2 <= A.length == B.length <= 20000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-domino-rotations-for-equal-row

上下都記錄一下每個數的上下的數的和以及都相等的數的個數,在遍歷1到6的時候判斷在減去相同的數的個數(相同不用旋轉)是否等於數組長度(只需要判斷到就可以break,因爲是對稱的)

class Solution {
    public int minDominoRotations(int[] A, int[] B) {
        int[][] a = new int[7][2];
        int [] sum = new int[7];
        int len = A.length;
        for(int i = 0; i < len; ++i){
           a[A[i]][0]++;
           a[B[i]][1]++;
           if(A[i] == B[i])
               sum[A[i]]++;
        }
        int mmin = -1;
        for(int i = 1; i <= 6; i++){
            if(a[i][0]==len || a[i][1] == len){
                mmin = 0;
                break;
            }
            else if(a[i][0] + a[i][1] - sum[i] == len){
                if(mmin == -1){
                    mmin = Math.min(a[i][0] , a[i][1]) - sum[i];
                }
                else{
                    mmin = Math.min(mmin , Math.min(a[i][0] , a[i][1]) - sum[i]);
                }   
                //爲了嚴謹性說一下break; 
                //2231
                //3222
                //此時的情況只有一種所以可以跳出
                //2211
                //1122
                //此時1和2可以相互轉換所以可以break
                break;
            }
        }
        return mmin;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章