zoukankan      html  css  js  c++  java
  • Leetcode 365 水壶问题 (扩展欧几里得)

    题目描述:

      有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

      你允许:

    • 装满任意一个水壶
    • 清空任意一个水壶
    • 从一个水壶向另外一个水壶倒水,直到装满或者倒空

    题解:

      题目允许的三个操作,分别对应+x,+y,+(max(x,y)-min(x,y))。根据贝祖定理(扩展欧几里得)有ax+by=gcd(a,b)。也就是说,如果z为gcd(a,b)的倍数的话,就有解。

    由于题目还有一个限制--选择x,y两个水壶中的一个或者两个来盛水。使用x,y最多能够盛x+y升的水,加一个判断就好了。

    AC代码:

      

    class Solution {
    public:
        int gcd(int x,int y)
        {
            if(y == 0) return x;
            return gcd(y,x%y);
        }
        bool canMeasureWater(int x, int y, int z) {
            int g = gcd(x,y);
            if(x+y < z ) return false;
            if(x == 0 && y == 0)
            {
                if(z == 0 )return true;
                return false;
            }
            if(x == 0 ) g = y;
            if(y == 0) g = x;
            if(z%g == 0) return true;
    
            return false;
        }
    };
  • 相关阅读:
    Python保留最后N个元素
    STL算法
    STL迭代器
    STL容器
    C++总结1
    牛客剑指Offer2
    Vue第一天
    UML
    Java继承和组合代码
    Java15后的sealed阻止继承滥用
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12603392.html
Copyright © 2011-2022 走看看