2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Leetcode之第N个神奇数字

Leetcode之第N个神奇数字

时间:2019-12-22 19:41:20

相关推荐

Leetcode之第N个神奇数字

题目:

如果正整数可以被 A 或 B 整除,那么它是神奇的。

返回第 N 个神奇数字。由于答案可能非常大,返回它模10^9 + 7的结果。

示例 1:

输入:N = 1, A = 2, B = 3

输出:2

示例2:

输入:N = 4, A = 2, B = 3

输出:6

示例 3:

输入:N = 5, A = 2, B = 4

输出:10

示例 4:

输入:N = 3, A = 6, B = 4

输出:8

提示:

1 <= N<= 10^9

2 <= A<= 40000

2 <= B<= 40000

代码:

int maxGCDfunc(int A,int B){if(A<B){int temp=A;A=B;B=temp;}while(A%B){int tempVal=A%B;A=B;B=tempVal;}return B;}int nthMagicalNumber(int N, int A, int B) {int mod=1e9+7;int minLCM=A*B/maxGCDfunc(A,B);long long left=1,right=1e18,mid;while(left<right){mid=(left+right)/2;long long num=mid/A+mid/B-mid/minLCM;if(num<N){left=mid+1;}else{right=mid;}}return int(left%mod);}

想法:

使用二分法计算第N个神奇数字,思路是在1和最大的数字之间使用二分法,如果1和mid之间的神奇数字数目小于N,那么left=mid+1,否则,right=mid,直到left等于right时候停止;需要注意的是,1和mid之间的数字计算方式是,mid/A+mid/B-mid/minLCM,其中minLCM是A和B的最大公约数等于A*B/maxGCD(A,B),需要弄清数字规律;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。