LeetCode每日一题_365_水壶问题

小菜鸟的第一篇博客从LeetCode开始!

2020-3-21 365_水壶问题(中等)

思路来自-LeetCode官方

题目:水壶问题题目描述

思路:数学方法实现
预备知识:裴蜀定理(贝祖定理)

  • 裴蜀定理:

    其是一个关于最大公约数的定理。
    该定理说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程:若a,b是整数,且gcd(a,b)= d,那么对于任意的整数x,y,ax+by都一定是d的倍数,一定存在整数x,y,使ax+by=d成立。

  • 重要推论

    a,b互质的冲要条件是存在整数x,y,使ax+by=1.

题目解读:

  1. 在题目所给的操作下,两个桶不能同时有水且不满。
  2. 每次操作只会让桶里的水总量增加x,增加y,减少x,减少y
  3. 354的倒法:
    ①先装满5L的B水壶,将5L中的3L倒入A水壶;(A—>3,B–>2)
    ②将A水壶中的水全部倒出,B水壶中的水倒入A壶;(A–>空—>2L , B—>0L)
    ③将B水壶装满;(B–>5L)
    ④将B中的水倒入A,将A装满; (A—>3,B—>4)

以上可知,现要找到一对整数a,b,使得

					          ax+by =z

要满足 z =<x+y ,.在本题中,需要找到x ,y的最大公约数并判断z是否是它的倍数即可。

Java解法:

class Solution {
    public boolean canMeasureWater(int x, int y, int z) {
        if( x==0 && y ==0 )  
            return z==0;
     
        return z == 0 || (z % gcd ( x ,y )== 0 && x+y >= z);
    }
    static int gcd(int x,int y){ // 辗转相除法
        return y == 0 ? x : gcd ( y , x % y ) ;
    }
}

C++:

class Solution {
public:
    bool canMeasureWater(int x, int y, int z) {
        return z == 0 || (x + y >= z && z % gcd(x, y) == 0);
    }
    int gcd(int x, int y) {
        return y == 0 ? x : gcd(y, x % y);
    }
};

LeetCode官方讲解
参考大神代码:365_水壶问题

最后告诉自己的是,求最大公约数很重要!超重要!特重要!代码背都要会背!
奥利给!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值