题目链接:https://leetcode.com/problems/minimum-domino-rotations-for-equal-row/
解题思路:一开始半天没有思路,看到最小最大之类的,以为要用dp或者贪婪算法,但是依然没思路,然后换种思路,观察,观察什么呢,观察数字特征,发现实际上达到能保证一个数翻转到一侧后能使一侧的数字全一样,这样的数字在A序列和B序列的个数总和必须超过序列长度的一半(这样的数是唯一的),才能保证A(B)序列的这个数字有足够的数量翻转到B(A),当然这是必要条件(条件1),另外还需要保证这个数字在两个序列中的位置能互补(条件2),满足条件1和条件2后,保证能够翻转,然后求翻转次数最小,则需要统计这个数在哪个序列中次数最多.
解题代码:
class Solution {
public:
int minDominoRotations(vector<int>& A, vector<int>& B) {
int lena=A.size(),lenb=B.size();
map<int,int> mp,mpa,mpb;
for(int i=0;i<lena;i++) {
mp[A[i]]++;
mpa[A[i]]++;
}
for(int i=0;i<lenb;i++) {
mp[B[i]]++;
mpb[B[i]]++;
}
int val=-1;
for(auto it : mp){
if(it.second>=lena){
val=it.first;
break;
}
}
if(val==-1) return -1;
for(int i=0;i<lena;i++){
if(A[i]!=val&&B[i]!=val) return -1;
}
if(mpa[val]>mpb[val]) return lena-mpa[val];
else return lenb-mpb[val];
}
};