本文主要是介绍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(nlogn) 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] 的最大值。
- 一次遍历查找,时间复杂度为 O ( n ) O(n) O(n)。
很显然第三种方法是在时间和空间复杂度上均衡度最高的,我们使用一次遍历查找来实现代码。
Go代码:
func buyChoco(prices []int, money int) int {first, second := math.MaxInt64, math.MaxInt64for _, 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)。
这篇关于LeetCode刷题题解:2706. 购买两块巧克力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!