leetcode 765カップルが手をつないで
一.原題の説明
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
The couples’ initial seating is given by
Example 1:
Example 2:
Note:
二.中国語の説明
N組のカップルは、連続して並んでいる2 N席に座り、相手の手を引っ張りたい.カップルごとに肩を並べて座ることができるように、座席を交換する回数を最小限に抑えます.1回の交換で任意の2人を選択し、立ち上がって席を交換させることができます.
人と座席は
これらのカップルの初期座席
例1:
例2:
説明: は、
三.問題を解く構想.
1.この問題では、まずデータを観察してみると、各カップルに対応する数値差は1であり、各カップルは隣接しなければならず、前後を問わず(すなわち、1組のカップル0、1の配列は1、0であってもよく、2人がそれぞれ対応する奇数位と偶数位であれば)
2.理解を助けるために、以下の例を挙げる
0位
1位
2位
3位
人対応番号
1
0
2
3
人対応番号
2
3
0
1
上の表は要件を満たすデータです
以下はテストデータ
グループ
0位
1位
2位
3位
第1グループ
0
2
1
3
第2グループ
3
2
0
1
3.次は解題です
(1)まず偶数位を固定して判断する(もちろんカップルごとに奇数位しか判断できない)、上記の表のテストデータを例にとると、0位と2位しか判断できない.
(2)第1グループ0位の判断では,まず人間0,そのカップルの値は1,第2グループ0位の判断では3,対応するカップル2となるので,以下の関係式を抽象化することができる.
このうち
(3)その後,上記の関係式に基づいてループを行い,cp[i]対応するカップルを見つけて交換する.このときコードは以下のようになる.
iは我々が検出した偶数ビットであり、jはcp[i]に対応するカップル値であり、cp[i+1]!=jの場合,i+2ビットからjを探し,見つけたら交換し,このサイクルを繰り返すと正解が得られる.
(4)完全なソースコードは以下の通りである.
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:
len(row)
is even and in the range of [4, 60]
. row
is guaranteed to be a permutation of 0...len(row)-1
. 二.中国語の説明
N組のカップルは、連続して並んでいる2 N席に座り、相手の手を引っ張りたい.カップルごとに肩を並べて座ることができるように、座席を交換する回数を最小限に抑えます.1回の交換で任意の2人を選択し、立ち上がって席を交換させることができます.
人と座席は
0
から2N-1
の整数で表され、カップルは順番に番号が付けられ、第1対は(0, 1)
、第2対は(2, 3)
で、このようにして、最後のペアは(2N-2, 2N-1)
である.これらのカップルの初期座席
row[i]
は、最初にi番目の席に座った人によって決定される.例1:
: row = [0, 2, 1, 3]
: 1
: row[1] row[2] 。
例2:
: row = [3, 2, 0, 1]
: 0
: , 。
説明:
len(row)
は偶数であり、数値は[4, 60]
の範囲内である.row
がシーケンス0...len(row)-1
の全配列であることを保証することができる.三.問題を解く構想.
1.この問題では、まずデータを観察してみると、各カップルに対応する数値差は1であり、各カップルは隣接しなければならず、前後を問わず(すなわち、1組のカップル0、1の配列は1、0であってもよく、2人がそれぞれ対応する奇数位と偶数位であれば)
2.理解を助けるために、以下の例を挙げる
0位
1位
2位
3位
人対応番号
1
0
2
3
人対応番号
2
3
0
1
上の表は要件を満たすデータです
以下はテストデータ
グループ
0位
1位
2位
3位
第1グループ
0
2
1
3
第2グループ
3
2
0
1
3.次は解題です
(1)まず偶数位を固定して判断する(もちろんカップルごとに奇数位しか判断できない)、上記の表のテストデータを例にとると、0位と2位しか判断できない.
(2)第1グループ0位の判断では,まず人間0,そのカップルの値は1,第2グループ0位の判断では3,対応するカップル2となるので,以下の関係式を抽象化することができる.
j=cp[i]%2==0?cp[i]+1:cp[i]-1;
このうち
j
はcp[i]
対応のカップルであり、cp[i]
が偶数の場合、その対応するカップルはcp[i]+1
に等しく、cp[i]
が奇数の場合、その対応するカップルはcp[i]-1
に等しい(3)その後,上記の関係式に基づいてループを行い,cp[i]対応するカップルを見つけて交換する.このときコードは以下のようになる.
for(int i=0;i<cp_len;i+=2)
{
int j;
j=cp[i]%2==0?cp[i]+1:cp[i]-1;
if(cp[i+1]!=j)
{
count0++;
for(int m=i+2;m<cp_len;m++)
{
if(cp[m]==j)// j
{
swap(cp[m],cp[i+1]);//
break;
}
}
}
}
iは我々が検出した偶数ビットであり、jはcp[i]に対応するカップル値であり、cp[i+1]!=jの場合,i+2ビットからjを探し,見つけたら交換し,このサイクルを繰り返すと正解が得られる.
(4)完全なソースコードは以下の通りである.
#include
using namespace std;
class couple{
public:
int match_couple(int* cp,int lenth)
{
count0=0;
cp_len=lenth;
for(int i=0;i<cp_len;i+=2)
{
int j;
j=cp[i]%2==0?cp[i]+1:cp[i]-1;
if(cp[i+1]!=j)
{
count0++;
// cout<
for(int m=i+2;m<cp_len;m++)
{
if(cp[m]==j)
{
swap(cp[m],cp[i+1]);
break;
}
}
}
}
return count0;
}
private:
int count0;
int cp_len;
};
void swap(int* a,int* b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
int main()
{
couple couples;
int a[]={0,2,1,3},lenth=0,swap_count=0;
lenth=sizeof(a)/sizeof(a[0]);
swap_count=couples.match_couple(a,lenth);
cout<<swap_count;
return 0;
}