0%

『LeetCode』2600 K 件物品的最大和

题目

2600. K 件物品的最大和

袋子中装有一些物品,每个物品上都标记着数字 10-1

给你四个非负整数 numOnesnumZerosnumNegOnesk

袋子最初包含:

  • numOnes 件标记为 1 的物品。
  • numZeroes 件标记为 0 的物品。
  • numNegOnes 件标记为 -1 的物品。

现计划从这些物品中恰好选出 k 件物品。返回所有可行方案中,物品上所标记数字之和的最大值。

示例 1:

输入:numOnes = 3, numZeros = 2, numNegOnes = 0, k = 2
输出:2
解释:袋子中的物品分别标记为 {1, 1, 1, 0, 0} 。取 2 件标记为 1 的物品,得到的数字之和为 2 。
可以证明 2 是所有可行方案中的最大值。

示例 2:

输入:numOnes = 3, numZeros = 2, numNegOnes = 0, k = 4
输出:3
解释:袋子中的物品分别标记为 {1, 1, 1, 0, 0} 。取 3 件标记为 1 的物品,1 件标记为 0 的物品,得到的数字之和为 3 。
可以证明 3 是所有可行方案中的最大值。

提示:

  • 0 <= numOnes, numZeros, numNegOnes <= 50
  • 0 <= k <= numOnes + numZeros + numNegOnes

标签

贪心, 数学


题解

【K 件物品的最大和】简单贪心

贪心

只有 1, 0, -1 三种数字可选,要使得和最大,毫无疑问先选 1,最后选 -1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Code language: Python
class Solution:
def kItemsWithMaximumSum(self, numOnes: int, numZeros: int, numNegOnes: int, k: int) -> int:
s = 0
if numOnes <= k:
s += numOnes
k -= numOnes
else:
return k
if numZeros <= k:
k -= numZeros
else:
return s
return s - min(k, numNegOnes)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Code language: Java
class Solution {
public int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) {
int s = 0;
if (numOnes <= k) {
s += numOnes; k -= numOnes;
}
else {
return k;
}
if (numZeros <= k) k -= numZeros;
else return s;
return s - Math.min(k, numNegOnes);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Code language: C++
class Solution {
public:
int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) {
int s = 0;
if (numOnes <= k) {
s += numOnes; k -= numOnes;
}
else return k;
if (numZeros <= k) k -= numZeros;
else return s;
return s - min(k, numNegOnes);
}
};
  • 时间复杂度: \(O(1)\)
  • 空间复杂度: \(O(1)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~