leetcode 1007. 行相等的最少多米诺旋转 —— 贪心算法

1007. 行相等的最少多米诺旋转

题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/minimum-domino-rotations-for-equal-row/

解题思路:

如果能使A中或者B中所有值都相等,比如都为该值x,那么必然在A[0]或B[0]中至少也存在一个x。

于是对于该问题,我们只需要考虑以A[0]、B[0]这两个数为基准,查找后面每个A[i]、B[i]元素中是否存在与A[0]、B[0]相等。例如以A[0]为基准,若A[i]、B[i]都不与基准相等,直接返回-1;否则将A数组全都变为A[0]或者B数组全都变为A[0]。这样得到两个旋转次数,选其中的小者即可。

public int minDominoRotations(int[] A, int[] B) {
    int n = A.length;
    int count_A = 0;
    int count_B = 0;
    int flag_AB = 0;
    // 先以A[0]为基准
    for (int i = 0; i < n; i++) {
        if (A[i] != A[0] && B[i] != A[0]) {
            flag_AB = 1;
            break;
        } else if (B[i] != A[0]) {
            count_B++;
        } else if (A[i] != A[0]) {
            count_A++;
        }
    }
    // 只要A数组或B数组都为A[0],则不需要再去判断B[0]。
    // 因为当A数组、B数组的元数都相同时(无论A[0]是否与B[0]相等),最小旋转次数是一样的。
    if (flag_AB != 1) {
        return Math.min(count_A, count_B);
    }
    // 当A[0]不满足要求时,并且B[0]等于A[0],则直接返回-1,否则再以B[0]为基准继续判断。
    else if (flag_AB == 1 && A[0] == B[0]){
        return -1;
    }
    count_A = 0;
    count_B = 0;
    flag_AB = 0;
    // 先以B[0]为基准
    for (int i = 0; i < n; i++) {
        if (A[i] != B[0] && B[i] != B[0]) {
            flag_AB = 1;
            break;
        } else if (B[i] != B[0]) {
            count_B++;
        } else if (A[i] != B[0]) {
            count_A++;
        }
    }
    if (flag_AB != 1) {
        return Math.min(count_A, count_B);
    } else {
        return -1;
    }
}

你可能感兴趣的:(算法理解)