1007. Minimum Domino Rotations For Equal Row

解题思路:一道筛子的题目,要求使用最少的交换次数使得上下两个筛子的数字都相同,归纳起来是一道数组配合数据结构的题目。

主要使用三个map来存储相应的信息

  • 两个数组的值分别对应的坐标集合
  • 两个数组的相同的值对应的坐标,这个是不同的坐标

遍历两个数组,将值与下标索引存入三个map中,然后处理三个数组

如果一个值在两个数组中的下标索引与数组长度相同,则可以得到答案,如果没有这样的值则返回-1

注意,如果两个筛子的值可以通过变换变成一致那么只可能有一种答案。

时间复杂度:O(n) / 空间复杂度:O(1)

class Solution {
public:
    int minDominoRotations(vector<int>& A, vector<int>& B) {
        if(A.size() != B.size()){
            return -1;
        }
        const int size = A.size();
        map<int, int> val_cnt_a;
        map<int, int> val_cnt_b;
        map<int, set<int>> dict;
        for(int i = 0; i < size; ++i){
            dict[A[i]].insert(i);
            dict[B[i]].insert(i);
            ++val_cnt_a[A[i]];
            ++val_cnt_b[B[i]];
        }
        for(auto& d : dict){
            if(d.second.size() == size){
                int common = val_cnt_a[d.first] + val_cnt_b[d.first] - size;
                return min(val_cnt_a[d.first] - common, val_cnt_b[d.first] - common);
            }
        }
        return -1;
    }
};

Published by Dongwei

stay hungry, stay foolish

Leave a comment