classSolution: defminElement(self, nums: List[int]) -> int: ans = inf for x in nums: tmp = 0 while x: tmp += x % 10 x= x//10 ans = min(ans, tmp) return ans
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicintminElement(int[] nums) { intans= Integer.MAX_VALUE; for (int x : nums) { inttmp=0; while (x > 0) { tmp += x % 10; x /= 10; } ans = Integer.min(ans, tmp); } return ans; } }
classSolution: defmaximumTotalSum(self, maximumHeight: List[int]) -> int: maximumHeight.sort(reverse = True) cnt = Counter(maximumHeight) ans = 0 curr = inf for x, ct in cnt.items(): if curr == inf: curr = x-ct for i inrange(ct): ans += x-i if curr < 0: return -1 else: if curr <= x: for i inrange(ct): ans += curr - i curr = curr-ct else: for i inrange(ct): ans += x - i curr = x-ct if curr < 0: return -1 return ans
classSolution { publiclongmaximumTotalSum(int[] maximumHeight) { Arrays.sort(maximumHeight); intn= maximumHeight.length; int[] b = newint[n]; for (inti=0; i < n; i++) { b[i] = maximumHeight[n-i-1]; } maximumHeight = b; LinkedHashMap<Integer,Integer> cnt = newLinkedHashMap<>(); for (int x : maximumHeight) { if (cnt.containsKey(x)) { cnt.put(x,cnt.get(x)+1); } else { cnt.put(x,1); } } intcurr= Integer.MAX_VALUE; longans=0L; for (int x : cnt.keySet()) { if (x < curr) { for (intk=0; k < cnt.get(x); k++) { ans += x-k; } curr = x - cnt.get(x); } else { for (intk=0; k < cnt.get(x); k++) { ans += curr-k; } curr = curr - cnt.get(x); } if (curr < 0) { return -1; } }
return ans; } }
注:这里一定要用LinkedHashMap,以此保证哈希表的关键字集是有序的(根据插入顺序)
灵茶山艾府解法
1 2 3 4 5 6 7 8 9
classSolution: defmaximunTotalSum(self, h:List[int])->int: h.sort(reverse=True) n = len(h) ans = h[0] for i inrange(1,n): h[i] = min(h[i-1]-1, h[i]) ans += h[i] return ans
classSolution: defcalc_z(self, s: str) -> list[int]: n = len(s) z = [0] * n box_l = box_r = 0# z-box 左右边界 for i inrange(1, n): if i <= box_r: z[i] = min(z[i - box_l], box_r - i + 1) # 改成手动 if 可以加快速度 while i + z[i] < n and s[z[i]] == s[i + z[i]]: box_l, box_r = i, i + z[i] z[i] += 1 return z
defminStartingIndex(self, s: str, pattern: str) -> int: pre_z = self.calc_z(pattern + s) suf_z = self.calc_z(pattern[::-1] + s[::-1]) suf_z.reverse() # 也可以不反转,下面写 suf_z[-i] m = len(pattern) for i inrange(m, len(s) + 1): if pre_z[i] + suf_z[i - 1] >= m - 1: return i - m return -1