招行笔试第二题是leetcode第765题:情侣牵手。
这题要求最少移动个数,我们通过贪心算法来解决。
贪心算法即为先通过交换让第一对情侣在一起,然后在看第二对,依次遍历所有数据。
对本题来讲,每组数是较小的偶数和大1的奇数,两者位置可互换。所以解题时,我们先判别每组的第一个数是偶数还是奇数。如果是偶数,往后找到比它大1 的奇数,然后与该组第二个数交换。如果是奇数,往后找到比它小1 的偶数,然后与该组第二个数交换。总的时间复杂度为O(n*n)。
int minSwapsCouples(vector<int>& row)
{
int cnt=0;
for(int i=1;i<row.size();i=i+2)
{
if((row[i-1]&1)==0)
{
if((row[i-1]+1)!=row[i])
{
for(int j=i+1;j<row.size();j++)
{
if(row[j]==(row[i-1]+1))
{
swap(row[i],row[j]);
cnt++;
}
}
}
}
else
{
if((row[i-1])!=(row[i]+1))
{
for(int j=i+1;j<row.size();j++)
{
if(row[i-1]==(row[j]+1))
{
swap(row[i],row[j]);
cnt++;
}
}
}
}
}
return cnt;
}