【LeetCode】力扣刷题之路
题目(20240513~20240517)
2908.元素和最小的山形三元组 I
给你一个下标从 0 开始的整数数组 nums 。
如果下标三元组 (i, j, k) 满足下述全部条件,则认为它是一个 山形三元组 :
- i < j < k
- nums[i] < nums[j] 且 nums[k] < nums[j]
请你找出 nums 中元素和最小的山形三元组,并返回其元素和。如果不存在满足条件的三元组,返回 -1 。
示例 1:
输入:nums = [8,6,1,5,3]
输出:9
解释:三元组 (2, 3, 4) 是一个元素和等于 9 的山形三元组,因为:
2 < 3 < 4
nums[2] < nums[3] 且 nums[4] < nums[3]
这个三元组的元素和等于 nums[2] + nums[3] + nums[4] = 9 。可以证明不存在元素和小于 9 的山形三元组。
示例 2:
输入:nums = [5,4,8,7,10,2]
输出:13
解释:三元组 (1, 3, 5) 是一个元素和等于 13 的山形三元组,因为:
1 < 3 < 5
nums[1] < nums[3] 且 nums[5] < nums[3]
这个三元组的元素和等于 nums[1] + nums[3] + nums[5] = 13 。可以证明不存在元素和小于 13 的山形三元组。
示例 3:
输入:nums = [6,5,4,3,4,5]
输出:-1
解释:可以证明 nums 中不存在山形三元组。
提示:
- 3 <= nums.length <= 50
- 1 <= nums[i] <= 50
代码
方法1:枚举
from typing import List
class Solution:
def minimumSum(self, nums: List[int]) -> int:
n = len(nums)
res = 1000
for i in range(n):
for j in range(i + 1, n):
for k in range(j + 1, n):
if nums[i] < nums[j] and nums[k] < nums[j]:
res = min(res, nums[i] + nums[j] + nums[k])
return res if res < 1000 else -1
if __name__ == '__main__':
s = Solution()
# 2908.元素和最小的山形三元组 I - 示例1
nums = [8, 6, 1, 5, 3]
res = s.minimumSum(nums)
print(res) # 输出:9
# 示例2
nums = [5, 4, 8, 7, 10, 2]
res = s.minimumSum(nums)
print(res) # 输出:13
# 示例3
nums = [6, 5, 4, 3, 4, 5]
res = s.minimumSum(nums)
print(res) # 输出: -1
方法2:数组
from typing import List
class Solution:
def minimumSum(self, nums: List[int]) -> int:
n = len(nums)
res = mn = 1000
left = [0] * n
for i in range(1, n):
left[i] = mn = min(nums[i - 1], mn)
right = nums[n - 1]
for i in range(n - 2, 0, -1):
if left[i] < nums[i] and nums[i] > right:
res = min(res, left[i] + nums[i] + right)
right = min(right, nums[i])
return res if res < 1000 else -1
if __name__ == '__main__':
s = Solution()
# 2908.元素和最小的山形三元组 I - 示例1
nums = [8, 6, 1, 5, 3]
res = s.minimumSum(nums)
print(res) # 输出:9
# 示例2
nums = [5, 4, 8, 7, 10, 2]
res = s.minimumSum(nums)
print(res) # 输出:13
# 示例3
nums = [6, 5, 4, 3, 4, 5]
res = s.minimumSum(nums)
print(res) # 输出: -1
2706.购买两块巧克力
给你一个整数数组 prices ,它表示一个商店里若干巧克力的价格。同时给你一个整数 money ,表示你一开始拥有的钱数。
你必须购买恰好两块巧克力,而且剩余的钱数必须是非负数。同时你想最小化购买两块巧克力的总花费。
请你返回在购买两块巧克力后,最多能剩下多少钱。如果购买任意两块巧克力都超过了你拥有的钱,请你返回 money 。注意剩余钱数必须是非负数。
示例 1:
输入:prices = [1,2,2], money = 3
输出:0
解释:分别购买价格为 1 和 2 的巧克力。你剩下 3 - 3 = 0 块钱。所以我们返回 0 。
示例 2:
输入:prices = [3,2,3], money = 3
输出:3
解释:购买任意 2 块巧克力都会超过你拥有的钱数,所以我们返回 3 。
提示:
- 2 <= prices.length <= 50
- 1 <= prices[i] <= 100
- 1 <= money <= 100
代码
from typing import List
class Solution:
def buyChoco(self, prices: List[int], money: int) -> int:
fst, sec = float('inf'), float('inf')
for price in prices:
if price < fst:
sec, fst = fst, price
elif price < sec:
sec = price
return money if money < fst + sec else money - fst - sec
if __name__ == '__main__':
s = Solution()
# 2706.买两块巧克力 - 示例1
prices = [1, 2, 2]
money = 3
res = s.buyChoco(prices, money)
print(res) # 输出:0
# 示例2
prices = [3, 2, 3]
money = 3
res = s.buyChoco(prices, money)
print(res) # 输出:3