力扣每日一题-----2998使X和Y相对的最少操作次数

力扣每日一题-----2998使X和Y相对的最少操作次数_第1张图片

    //1.如果 x 是 11 的倍数,将 x 除以 11 。

    //2.如果 x 是 5 的倍数,将 x 除以 5 。

    //3.将 x 减 1 。

    //4.将 x 加 1 。

       本题中我们知道每次都只有四次操作,那么这四次操作中,我们什么时候执行四次操作呢?
就算是暴搜的话,我们也得是越趋近那个值才行把,不是漫无目的的去爆搜把,那么我们就可以根据这个问题去看,怎么趋近,如果x < y的话,那么不可能是1,2,3操作,那么我们知道这个性质了,那么执行其他操作了的话,是不是也可以通过这个分析出来啊。

       是的,那么如果y > x的话,怎么样呢,这个其实就有三种情况了,具体是哪个我们不清楚

我们采取爆搜的方式搜,如果是采用第二种操作的话,那么我们不知道是先放大再整除5来的小,还是先缩小再整除5来的小,同理第一种操作也是一样,放大缩小的数可以计算出来,

这里很多朋友不明白的地方是,是放大多少,是缩小多少呢?这就需要知道我们的贪心策略了

我们就贪比x大的最小的5的倍数,贪bx小的最大的5的倍数,那么根据这个贪心策略我们就知道了怎么搜索了,但是虽然我们知道了这几个操作怎么去搜索,不用记忆化搜索也能过,但是我们

其实可以用记忆化搜索,因为有可能会碰到前面x变换的值相同的时候,此时可以判断是否前面有遇到过,遇到过就不用再去搜索了

class Solution {
public:
    //1.如果 x 是 11 的倍数,将 x 除以 11 。
    //2.如果 x 是 5 的倍数,将 x 除以 5 。
    //3.将 x 减 1 。
    //4.将 x 加 1 。
    //上述操作中我们发现一个特性,就是当如果x小于y的话
    //我们不能采取1,2,3这三个操作,采用这三个操作的话,会
    //使x到y的操作次数变的更多,所以当x小于y的时候直接采用
    //4的操作
    //如果abs(y - x / 11) >= (y - x) && abs(y - x / 5) >= (y - x)
    //此时我们就直接采用第三个操作
    //那如果不是第一和第四个操作呢
    //如果abs(y - x / 11) <= abs(y - x / 5)
    //那就第一个操作
    //否则就是第二个操作
    unordered_map hashs;
    int minimumOperationsToMakeEqual(int x, int y) 
    {
        int res = 0x3f3f3f3f;
        if(x <= y) return y - x;
            
            auto it = hashs.find(x);
            if (it != hashs.end()) return hashs[x];

            res = min(res,x - y);
            res = min(res,minimumOperationsToMakeEqual(x / 11,y) + x % 11 + 1); 
            res = min(res,minimumOperationsToMakeEqual(x / 11 + 1,y)+ 11 - x % 11 + 1);
            res = min(res,minimumOperationsToMakeEqual(x / 5,y) + x % 5 + 1);
            res = min(res,minimumOperationsToMakeEqual(x / 5 + 1,y) + 5 - x % 5 + 1);
            hashs[x] = res;
        return res;
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)