题解/算法 {100159. 使 X 和 Y 相等的最少操作次数}
@LINK: https://leetcode.cn/problems/minimum-number-of-operations-to-make-x-and-y-equal/
;
很難想到 其實直接BFS就可以…
是因為他的BFS層數很小嗎? 錯誤, 比如X=1, Y=10000
此時你只能執行X ++
操作, 即BFS樹深度是1e4
級別;
深度這麼大 顯然樹的規模是非常大的, 但本題非常特別: 她不會涉及到負數 而且所有合法的節點 其實就是[1, max(X,Y) + 11]
這些數 (+11
的原因是: 比如X += k
到達一個5/11
的倍數 然後執行/5或/11
後 變成Y
); 也就是 超過這個範圍的數 一定不會是答案路徑上的點, 因此 一共也就1e4
個點 (n個點的BFS 時間是O(4(分支數)*n)
);
int minimumOperationsToMakeEqual(int X, int Y) {
{
int Ma = max(X,Y) + 11;
static int Dist[ 20004];
memset( Dist, -1, sizeof(Dist[0]) * Ma);
using T_ = int;
queue< T_> que;
const T_ start = X, target = Y;
que.push( start); Dist[ start] = 0;
while( !que.empty()){
auto cur = que.front(); que.pop();
if( cur == target){
return Dist[target];
break;
}
if( cur%5 == 0){
auto nex = cur / 5;
if( Dist[nex] == -1){ Dist[nex]=Dist[cur]+1; que.push( nex);}
}
if( cur%11 == 0){
auto nex = cur / 11;
if( Dist[nex] == -1){ Dist[nex]=Dist[cur]+1; que.push( nex);}
}
if( cur < Ma){
auto nex = cur + 1;
if( Dist[nex] == -1){ Dist[nex]=Dist[cur]+1; que.push( nex);}
}
if( cur > 1){
auto nex = cur - 1;
if( Dist[nex] == -1){ Dist[nex]=Dist[cur]+1; que.push( nex);}
}
}
}
return -1;
}