解题思路:一道筛子的题目,要求使用最少的交换次数使得上下两个筛子的数字都相同,归纳起来是一道数组配合数据结构的题目。
主要使用三个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;
}
};