数组中最大数字的总和

Rav*_*ale 0 java arrays sorting

arr是一个只有 5 个元素的 int 数组。我们只需要从这 5 个元素中计算 4 个最小最小数的总和和 4 个最大最大数的总和。

例子: int[] arr= {5,2,3,4,1}

在这个数组中,4 个最小的最小数是:1,2,3,4所以 totalMin = 1 + 2 + 3 + 4 = 10

最大的 4 个最大数字是:5,4,3,2 所以totalMax = 14

所以输出将是:10, 14

我下面的代码在40% 的情况下正常工作,但在60% 的情况下不起作用。

我首先对 Array 进行排序 .. 所以总是最小的数字将是: arr[0], arr[1], arr[2], arr[3]并且MAX将是arr[4], arr[3], arr[2], arr[1]

HackerRank 显示我的这个答案在某些情况下是错误的,但那些已被锁定。我不知道那些案例……我也想知道那些案例会是什么?

有人可以解释我吗?我在这里做错了什么?

您可以在此处查看问题的更多详细信息:https : //www.hackerrank.com/challenges/mini-max-sum/problem

static void miniMaxSum(int[] arr) 
{
    Arrays.sort(arr);
    Integer min=arr[0]+arr[1]+arr[2]+arr[3];
    Integer Max=arr[4]+arr[3]+arr[2]+arr[1];
    System.out.println(min+" "+Max);
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 6

在给定的约束下,您可以产生的最大总和是 4 * 10 9,这会溢出一个整数。但是,它非常适合 a long,因此将值汇总为longs 应该可以解决问题:

long min = (long)arr[0] + (long)arr[1] + (long)arr[2] + (long)arr[3];
long max = (long)arr[4] + (long)arr[3] + (long)arr[2] + (long)arr[1];
Run Code Online (Sandbox Code Playgroud)

但是请注意,由于排序,该解决方案仍然具有 O(nlog(n)) 时间复杂度。
这可以改进为 O(n) - 在数组的单次传递中,您可以获得它的总和、最小值和最大值,然后从总和中减去最大值以得到“最小值”值和总和中的最小值得到“最大值”。

使用 anIntStream将为您完成大部分繁重的工作:

IntSummaryStatistics stat =  Arrays.stream(arr).summaryStatistics();
long min = stat.getSum() - stat.getMax();
long max = stat.getSum() - stat.getMin();
Run Code Online (Sandbox Code Playgroud)