左神 step num
给定一个正整数,判断它是否是某个数的step num
680的step num为680+68+6
if a<b,则 stepnum(a)<stepnum(b)
class Solution { boolean f(int x) { int l = 0, r = x; while (l <= r) { int m = l + ((r - l) >> 1); if (check(m) == x) { return true; } else if (check(m) < x) { l = m + 1; } else { r = m - 1; } } return false; } private int check(int x) { int ans = 0; while (x != 0) { ans += x; x /= 10; } return ans; } }
左神 胡广燕吃香蕉
有n堆香蕉
piles[i]表示第i堆香蕉的个数
警卫将会离开h小时
胡广燕吃香蕉的速度为k(单位:根/小时)
如果这堆香蕉少于k根,她将吃掉所有香蕉,一小时之后,才可以吃其他堆的香蕉
返回她可以在h小时内吃掉所有香蕉的最小速度k
if a<b,则check(a)>=check(b) check(a)表示胡广燕吃香蕉的速度为a,吃完所有香蕉要几个小时
class Solution { /** * @param arr 每堆香蕉的数量 * @param h 警卫离开h小时 * @return 胡广燕吃完所有香蕉的最小速度 */ int f(int[] arr, int h) { //1 int l = 0, r = Integer.MIN_VALUE, ans = 0, n = arr.length; for (int i = 0; i < n; i++) { r = Math.max(r, arr[i]); } //2 while (l <= r) { int m = l + ((r - l) >> 1); //compare with h if (check(m, arr) == h) { ans = m; r = m - 1; //valid } else if (check(m, arr) < h) { //smaller r = m - 1; } else { r = m - 1; } } return ans; } /** * @param m 每小时吃m个香蕉 * @param arr 每堆香蕉的数量 * @return */ private int check(int m, int[] arr) { int ans = 0; for (int i = 0; i < arr.length; i++) { ans += (arr[i] + m - 1) / m; } return ans; } }
左神 完成所有画作所需要的最少时间
arr[i]表示完成第i幅画需要的时间
num表示画匠的数量
每个画匠只能画连在一起的画作
所有的画家并行工作
返回完成所有画作所需要的最少时间
if a<b,则check(a)>=check(b) check(a)表示要在a个小时内完成所有画作,需要几个画匠
class Solution { /** * @param arr arr[i]表示完成第i幅画需要的时间 * @param num 画匠的数量 * @return 完成所有画作的最少时间 */ int f(int[] arr, int num) { //1 int l = Integer.MIN_VALUE, r = 0, ans = 0; for (int i = 0; i < arr.length; i++) { l = Math.max(l, arr[i]); } for (int i = 0; i < arr.length; i++) { r += arr[i]; } //2 while (l <= r) { int m = l + ((r - l) >> 1); //compare with num if (check(m, arr) == num) { ans = m; r = m - 1; //valid } else if (check(m, arr) < num) { r = m - 1; } else { l = m + 1; } } return ans; } /** * @param m 要在m小时内完成所有画作 * @param arr * @return 要在m小时内完成所有画作,需要的画匠的数量 */ public int check(int m, int[] arr) { int ans = 0, sum = 0; for (int i = 0; i < arr.length; i++) { if (sum + arr[i] == m) { ans++; sum = 0; } else if (sum + arr[i] < m) { sum += arr[i]; } else { ans++; sum = arr[i]; } } if (sum > 0) ans++; return ans; } }