热心的牛牛题解
30分解法
由于k最大范围是100,所以只需要从0向上遍历即可,假设牛牛有x块糖果,他的n个朋友每个至少有x+1块糖果,所以只要在遍历过程中遇到,说明此时糖果不够了,跳出循环输出即可。最多遍历k次,所以时间复杂度o(k),空间复杂度o(1)
100分解法
这里介绍两种做法
解法一:二分,时间复杂度o(logk),空间复杂度o(1)
思想和30分解法相同,同时我们不难发现这个问题是单调的,所以我们只要令l=0,r=k每次二分判断就能得到我们想要的答案。但是二分时有一个比较坑的易错点,就是n*(x+1)会爆long long。这里可以用__int128判断一下他们的乘积,当然这个问题也可以通过修改二分范围规避。因为二分上界实际到不了k,由于一共n+1个人,即使牛牛可以拥有和他人一样的糖数,他最多也只能拥有k/(n+1)个糖果,所以把二分上界调为k/(n+1)同样可以规避这个问题。下面是代码:
class Solution { public: /** * 返回牛牛能吃到的最多糖果数 * @param n long长整型 * @param k long长整型 * @return long长整型 */ long long Maximumcandies(long long n, long long k) { // write code here long long l=0,r=k/(n+1),mid,pos; while(l<=r) { mid=(l+r)/2; if(n*(mid+1)+mid<=k) { pos=mid; l=mid+1; } else r=mid-1; } return pos; } };
解法二:推公式,时间复杂度o(1),空间复杂度o(1)
其实推出公式牛牛获得的糖果x必须满足后,移项整理一下就可以得到
,直接输出答案即可。下面是代码
class Solution { public: /** * 返回牛牛能吃到的最多糖果数 * @param n long长整型 * @param k long长整型 * @return long长整型 */ long long Maximumcandies(long long n, long long k) { // write code here return (k-n)/(n+1); } };