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 ):
- 双层循环查找,时间复杂度为 O ( n 2 ) O(n^2) O(n2)
- 排序后取最小和次小,时间复杂度为 O ( n l o g ? n ) O(nlog?n) O(nlog?n)。如果使用基于非比较的排序算法,时间复杂度为 O ( n + m ) O(n+m) O(n+m),其中 m m m 为 p r i c e s [ i ] prices[i] prices[i] 的最大值。
- 一次遍历查找,时间复杂度为 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)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!