Leetcode-2998

Minimum Number of Operations to Make X and Y Equal

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <queue>
#include <vector>

const int INF = 0x3fff'ffff;

int div_11(int x) {
    int y = x / 11;
    if (x == y * 11) {
        return y;
    }
    return 0;
}

int div_5(int x) {
    int y = x / 5;
    if (x == y * 5) {
        return y;
    }
    return 0;
}

int plus_1(int x) {
    return ++x;
}

int minus_1(int x) {
    return --x;
}

class Solution {
public:
    int minimumOperationsToMakeEqual(int x, int y) {
        if (x <= y) {
            return y - x;
        }
        int nmax = x * 11, tmp;
        int (*fcns[])(int) = { div_11, div_5, minus_1, plus_1 };
        std::vector<int> dist(nmax + 1, INF);
        std::queue<int> q;
        q.push(x);
        dist[x] = 0;
        while (true) {
            int u = q.front();
            q.pop();
            for (auto& f : fcns) {
                int v = f(u);
                if (v < 1 || v > nmax) {
                    continue;
                }
                if (v == y) {
                    return dist[u] + 1;
                }
                if (dist[v] == INF) {
                    dist[v] = dist[u] + 1;
                    q.push(v);
                }
            }
        }
        return -1;
    }
};

Leetcode-2998

Licensed under CC BY-NC-SA 4.0