Couples Holding Hands

[Problem] 
https://leetcode.com/problems/couples-holding-hands/description/

N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum number of swaps so that every couple is sitting side by side. A swap consists of choosing any two people, then they stand up and switch seats.
The people and seats are represented by an integer from 0 to 2N-1, the couples are numbered in order, the first couple being (0,1), the second couple being (2,3), and so on with the last couple being (2N-2, 2N-1).
The couples' initial seating is given by row[i] being the value of the person who is initially sitting in the i-th seat.
Example 1:
Input: row = [0, 2, 1, 3]
Output: 1
Explanation: We only need to swap the second (row[1]) and third (row[2]) person.
Example 2:
Input: row = [3, 2, 0, 1]
Output: 0
Explanation: All couples are already seated side by side.
Note:
  1.  len(row) is even and in the range of [4, 60].
  2.  row is guaranteed to be a permutation of 0,...,len(row)-1.


[Solution] 

Get my partner back to me.

The problem says the couple should sit together.
So it's obvious that one person should sit on seat #i, and his partner should sit on seat #i+1, where i is an even number.
e.g
   seat number : 0 1 2 3 4 5
            person : 4 5 1 0 3 2

The problem did not ask everyone to sit on the seat with the same number. They can sit whatever they want as long as they are next their partner.
So to minimize the movement of these people, it obvious to ask one person sit on the same seat, and his partner move next to him. There is no need to move both of them(the couple), since one of them is already sit on the appropriate seat.

So here is a greedy algorithm :
The person who sit on seat #i don't move, where i is an even number.
Then we find his partner and move him back to seat #i+1.


class Solution { public: int minSwapsCouples(vector<int>& row) { vector<int> pos(row.size()); //position of certain numner int ans=0; for(int p=0;p<row.size();p++) pos[row[p]] = p; for(int i=0;i<row.size();i+=2){ int mycouple = row[i]%2 ==0 ? row[i]+1 : row[i]-1; if(row[i+1]!=mycouple){ swap(row,pos,row[i+1],mycouple); ans++; } } return ans; } void swap(vector<int>& row, vector<int>& pos, int a, int b){ int posa=pos[a]; int posb=pos[b]; //swap item in row int tmp=row[posa]; row[posa]=row[posb]; row[posb]=tmp; //swap pos info pos[a]=posb; pos[b]=posa; } };