n 是三除數當且僅當它的除數爲 1, n 和 sqrt(n)app
class Solution { public boolean isThree(int n) { for (int i = 2; i * i <= n; i++) { if (n % i == 0) { return i * i == n; } } return false; } }
咱們並不須要關心如何安排工做。只要工做量最大的任務不超過其餘任務的總和,那麼必定能夠完成全部的任務,不然工做量最大的任務將會剩下一部分沒法完成。code
class Solution { public long numberOfWeeks(int[] milestones) { long sum = 0, max = 0; for (int i : milestones) { sum += i; max = Math.max(max, (long) i); } if (sum - max >= max) { return sum; } return sum - (max * 2 - sum - 1); } }
二分答案 + 數學推導。能夠寫出兩層循環,而後數列求和,便可獲得總的求和公式。ci
class Solution { public long minimumPerimeter(long neededApples) { long min = 1, max = (long) 100000; while (min + 1 < max) { long mid = (min + max) / 2; if (apples(mid) < neededApples) { min = mid; } else { max = mid; } } return (apples(min) >= neededApples ? min : max) * 8; } private long apples(long dis) { long result = 0; // for (long x = -dis; x <= dis; x++) { // for (long y = -dis; y <= dis; y++) { // result += Math.abs(x) + Math.abs(y); // } // } result += (1 + dis) * dis * (dis * 2 + 1); result += (1 + dis) * dis * (dis * 2 + 1); return result; } }
遞推便可。過程當中記錄 0 序列數量、01 序列數量、012 序列數量,令 dp[1] 表示 0 序列數量,dp[2] 表示 01 序列,dp[3] 表示 012 序列。數學
class Solution { public int countSpecialSubsequences(int[] nums) { long[] dp = {1, 0, 0, 0}; for (int num : nums) { dp[num + 1] = (dp[num + 1] * 2 + dp[num]) % 1000000007L; } return (int) dp[3]; } }