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)。

你可能感兴趣的:(leetcode刷题题解,leetcode,算法,职场和发展)