2591. 将钱分给最多的儿童
class Solution:
def distMoney(self, money: int, children: int) -> int:
if money < children: return -1
money -= children # 每人至少 1 美元
res = min(money // 7, children) # 初步分配,让尽量多的人分到 8 美元
money -= res * 7
children -= res
if (children == 0 and money > 0) or (children == 1 and money == 3):
res -= 1
return res
2706. 购买两块巧克力
算法:最小值与次最小值
class Solution:
def buyChoco(self, prices: List[int], money: int) -> int:
a = b = inf
for x in prices:
if x < a:
b, a = a, x
elif x < b:
b = x
return money - a - b if a + b <= money else money
374. 猜数字大小
算法:二分查找
# The guess API is already defined for you.
# @param num, your guess
# @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
# def guess(num: int) -> int:
class Solution:
def guessNumber(self, n: int) -> int:
l, r = 1, n
while l <= r:
mid = l + r >> 1
if guess(mid) == 1: l = mid + 1
elif guess(mid) == -1: r = mid - 1
else: return mid
1732. 找到最高海拔
算法:差分逆运算前缀和
class Solution:
def largestAltitude(self, gain: List[int]) -> int:
res = acc = 0
for x in gain:
acc += x
if acc > res: res = acc
return res
1413. 逐步求和得到正数的最小值
算法:前缀和
class Solution:
def minStartValue(self, nums: List[int]) -> int:
ans, acc = 1, 0
for x in nums:
acc += x
if acc < 0:
ans = max(ans, 1 - acc)
return ans
2057. 值相等的最小索引
class Solution:
def smallestEqual(self, nums: List[int]) -> int:
for i, x in enumerate(nums):
if i % 10 == x: return i
return -1
1217. 玩筹码
第 i 个芯片的 位置 是 position[i],注意不是筹码数。
知识点: for, %, min(), +=
class Solution:
def minCostToMoveChips(self, position: List[int]) -> int:
# odd = even = 0
# for k in position:
# if k % 2: odd += 1
# else: even += 1
# return min(even, odd)
# d = [0, 0]
# for i in position: d[i%2] += 1
# return min(d)
return min(x := sum(i & 1 for i in position), len(position) - x)
1184. 公交站间的距离
class Solution:
def distanceBetweenBusStops(self, distance: List[int], start: int, destination: int) -> int:
if destination < start: # 交换出发点和目的地距离相等
start, destination = destination, start
d = sum(distance[start : destination]) # 出发点到目的地距离
return min(d, sum(distance) - d)
2057. 值相等的最小索引
class Solution:
def smallestEqual(self, nums: List[int]) -> int:
for i, x in enumerate(nums):
if i % 10 == x: return i
return -1
2455. 可被三整除的偶数的平均值
class Solution:
def averageValue(self, nums: List[int]) -> int:
sum = count = 0
for x in nums:
if x % 6 == 0:
sum += x
count += 1
return 0 if count == 0 else sum // count
2078. 两栋颜色不同且距离最远的房子
class Solution:
def maxDistance(self, colors: List[int]) -> int:
n = len(colors)
res = 0 # 两栋颜色不同房子的最远距离
# 遍历两栋房子下标并维护最远距离
for i in range(n):
for j in range(i + 1, n):
if colors[i] != colors[j]:
res = max(res, j - i)
return res
优化
class Solution:
def maxDistance(self, colors: List[int]) -> int:
n = len(colors)
c = colors[0]
if c != colors[-1]: return n - 1
i, j = 1, n - 2
while colors[i] == c: i += 1
while colors[j] == c: j -= 1
return max(j, n - i - 1)
2073. 买票需要的时间
class Solution:
def timeRequiredToBuy(self, tickets: List[int], k: int) -> int:
n = len(tickets)
res = 0
for i in range(n):
# 遍历计算每个人所需时间
if i <= k:
res += min(tickets[i], tickets[k])
else:
res += min(tickets[i], tickets[k] - 1)
return res
1848. 到目标元素的最小距离
class Solution:
def getMinDistance(self, nums: List[int], target: int, start: int) -> int:
res = inf
for i, x in enumerate(nums):
if x == target:
res = min(res, abs(i - start))
return res