LeetCode刷题题解:2706. 购买两块巧克力

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

思路与算法:

该题目的意思就是寻找数组中的最小值和次小值,有三个解题思路(下文中的 n n n p r i c e s . l e n g t h prices.length prices.length ):

  1. 双层循环查找,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  2. 排序后取最小和次小,时间复杂度为 O ( n l o g ⁡ n ) O(nlog⁡n) O(nlogn)。如果使用基于非比较的排序算法,时间复杂度为 O ( n + m ) O(n+m) O(n+m),其中 m m m p r i c e s [ i ] prices[i] prices[i] 的最大值。
  3. 一次遍历查找,时间复杂度为 O ( n ) O(n) O(n)

很显然第三种方法是在时间和空间复杂度上均衡度最高的,我们使用一次遍历查找来实现代码。

Go代码:

func buyChoco(prices []int, money int) int {
	first, second := math.MaxInt64, math.MaxInt64
	for _, price := range prices {
		if price < first {
			first, second = price, first
		} else if price < second {
			second = price
		}
	}
	if money < first+second {
		return money
	}
	return money - first - second
}

复杂度分析:

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。
  • 31
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Corey James

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值