【发布时间】:2023-03-14 18:16:02
【问题描述】:
问题陈述:
给定一个
N*M矩阵和一个整数K,你需要从矩阵中精确地选择K个整数,使得所选择的K个数之和最大。
但这里有一个问题,在从特定行中选择数字时,比如i-th行,我们只能选择该行的j-th元素,前提是我们从该行中选择了前 (j-1) 个元素作为好吧。
约束:1 <= N <= 50; 1 <= M <= 100; 1 <= K <= N*M; |matrix[i][j]| <= 100
示例:N = 4,M = 4,K = 5
matrix = {
{1, 2, 3, 4},
{3, 4, 1, 1},
{4, 5, 20, 1},
{1, 2, 3, 4}};
预期输出:36(通过从第 2 行中选择 3 和 4 以及从第 3 行中选择 4、5 和 20)。
我的方法:对于每一行,我计算了每一列的前缀总和以及平均值(如preSum[j] / (j+1))并将其存储在maxSum 数组中。然后对数组进行倒序排序,对平均值较高的元素进行贪婪求和,直到找到K个元素。
import java.util.*;
class Solution
{
public static int getMaximumKSum(int[][] matrix, int N, int M, int K)
{
int preSum = 0, MAX = 0;
RowSum average [] = new RowSum [N*M];
for (int i=0, z=0; i<N; i++)
{
preSum = 0;
for (int j=0; j<M; j++)
{
preSum += matrix[i][j];
average[z++] = new RowSum(i, j+1, preSum, ((double)preSum/(j+1)));
}
}
Arrays.sort(average, (x, y) -> Double.compare(y.average, x.average));
//System.out.println( Arrays.toString(average) );
Set<Integer> row = new HashSet<>();
for (RowSum S : average)
{
if (K <= 0) break; // All `K` elements found!
if (!row.contains(S.row) && S.n<=K)
{
MAX += S.sum;
row.add(S.row);
K -= S.n;
}
}
return MAX;
}
public static void main(String[] args)
{
int N = 4, M = 4, K = 5;
int [][] matrix = {{1, 2, 3, 4},
{3, 4, 1, 1},
{4, 5, 20, 1},
{1, 2, 3, 4}};
System.out.println(getMaximumKSum(matrix, N, M, K));
}
}
class RowSum
{
int row,n,sum; // rowNo | number of elements | total sum of 'n' elements
double average; // = sum / n
RowSum(int a, int b, int c, double d)
{
row = a; n = b; sum = c; average = d;
}
public String toString()
{ return String.format("(%d*%.2f)", n, average); }
}
我的代码为自定义输入提供了所需的结果,但在提交时,它给出了一个错误的判断。
所以,要么我的方法完全错误(那么请提出一个正确的方法来解决这个问题)或
它在某些边缘情况下失败(然后请提出适当的修改)。谢谢。
【问题讨论】:
-
矩阵 {{0,99},{50,0},{1,0}} 是否打破了您的贪婪方法?需要 50(因为 (0+99)/2
-
@Nikxp 我想是的,也许我选择的元素不正确。
-
你能证明使用前缀平均和的正确性吗?
-
能否详细说明任务描述中的第i个和第j个?
-
@Surt 好的,假设我们要从
i=3rd 行中选择 5。因此,由于 5 在j=2th 列中,我们不能单独选择它,因为在 5 之前还有其他元素出现。因此,必须选择 4 和 5。同样,如果我们要选择 20 (a[2][2]),那么我们也必须选择 4 (a[2][0]) 和 5 (a[2][1])。因此,选定的元素将是 4、5 和 20。这同样适用于其他行。
标签: java algorithm data-structures