2600.K 件物品的最大和

【LetMeFly】2600.K 件物品的最大和

力扣题目链接:https://leetcode.cn/problems/k-items-with-the-maximum-sum/

袋子中装有一些物品,每个物品上都标记着数字 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

方法一:贪心

选择一个“numOnes”能得1分,选择一个“numZeros”能得0分,选择一个“numNegOnes”得-1分;一共选k个,那当然是尽量选numOnes,之后尽量选numZeros,实在迫不得已再选numNegOnes。

因此我们可以建立一个二维数组:

1
2
3
4
5
a = [
[numOnes, 1],
[numZeros, 0],
[numNegOnes, -1]
]

接着从0到2遍历数组$a$,在$k$未选择完时尽可能地选取$a[i][0]$,并将选择数量乘以$a[i][1]$累加到总分上。

  • 时间复杂度$O(1)$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) {
int ans = 0;
int a[3][2] = {{numOnes, 1}, {numZeros, 0}, {numNegOnes, -1}};
for (int i = 0; i < 3; i++) {
int thisNum = min(k, a[i][0]);
ans += a[i][1] * thisNum;
k -= thisNum;
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
class Solution:
def kItemsWithMaximumSum(self, numOnes: int, numZeros: int, numNegOnes: int, k: int) -> int:
ans = 0
a = [[numOnes, 1], [numZeros, 0], [numNegOnes, -1]]
for i in range(3):
thisNum = min(k, a[i][0])
ans += thisNum * a[i][1]
k -= thisNum
return ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/131547457


2600.K 件物品的最大和
https://blog.letmefly.xyz/2023/07/05/LeetCode 2600.K件物品的最大和/
作者
Tisfy
发布于
2023年7月5日
许可协议