簡體   English   中英

數組中最大數字的總和

[英]sum of Max numbers in Array

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);
}

根據給定的約束,您可以產生的最大總和是 4 * 10 9 ,這會溢出一個整數。 但是,它非常適合long ,因此將值與long相加應該可以解決問題:

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];

但是請注意,由於排序,該解決方案仍然具有 O(nlog(n)) 時間復雜度。
這可以改進為 O(n) - 在數組的單次傳遞中,您可以獲得它的總和、最小值和最大值,然后從總和中減去最大值以得到“最小值”值和總和中的最小值得到“最大值”。

使用IntStream將為您完成大部分繁重的工作:

IntSummaryStatistics stat =  Arrays.stream(arr).summaryStatistics();
long min = stat.getSum() - stat.getMax();
long max = stat.getSum() - stat.getMin();
long first =  arr[0];

long second =  arr[1];

long third =  arr[2];

long fourth =  arr[3];

long fifth =  arr[4];

long min = first + second + third + fourth;

long Max  = second + third + fourth + fifth;

上面會起作用,原因是輸入和結果可能超過 32 位所以我們必須使用 long 並且我們在進行求和運算之前已經轉換了 long 的每個值,因為它也可能超過32 位

是的。 我的錯誤是沒有將int轉換為long (64 位整數)。錯誤是由於整數溢出

    static void miniMaxSum(int[] arr) 
     {
        Arrays.sort(arr);
        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];
        System.out .println(min+" "+max);
     }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM