【LeetCode】力扣刷题之路 (20240513~20240517)

题目(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值