簡體   English   中英

在數組中查找一對的第三大和

[英]Find 3rd highest sum of a pair in an array

如果我們必須找到數組中一對元素的第三大和。

例如給定

int arr[] = { 1, 2, 3, 4 }; 

然后,我們有這些對:

(1,2) = 3, (1,3) = 4, (1,4) = 5, (2,3) = 5, (2,4) = 6, (3,4) = 7

在這里,答案是 5,成對是 (1,4) 和 (2,3)。

數組不一定要排序,數組中的重復值可以成對出現。

我嘗試了一種帶有兩個嵌套循環的算法。 時間復雜度是二次的。 如何降低復雜度?

現在,如果我們需要找到第 k 個最高的對和。 我們可以使用 minheap 或 maxheap,其中我們首先將對和存儲在 maxheap/minheap 中,然后找到它們中的第 k 大。

首先嘗試一種蠻力方法:

  • 用雙循環掃描數組以找到最大的總和sum1
  • 用雙循環重新掃描數組以找到與sum1不同的最大和sum2
  • 重新掃描該陣列的第三時間來找到最大和sum3從兩個不同sum1sum2 ;
  • 最后一次重新掃描數組以打印所有具有sum3

時間復雜度是二次的,但它會正確處理重復項。

然后,您可以通過過濾數組來大幅降低復雜性,如果有重復,則只保留最多 2 個實例的最大 3 個數字。 這可以在線性時間內完成。 然后在最多 6 個元素的集合上運行二次算法。 總復雜度仍然是線性的。

var a=[30,4,2,5,6,0,9];
var first=a[0];
var second="";
var third="";
// Solve it in O(n) time
for(var i=1;i<a.length;i++)
{
    //Find first Max
    if(a[i]>first)
    { 
      second=first;
      first=a[i];
    } 
    //Find second Max
    else if(a[i]>second && a[i]!=first )
     {
         third=second;
         second=a[i];
     }
    //Find third Max
    else if(a[i]>third && a[i]!=first && a[i]!=second)
         third=a[i];
}
console.log(first+second+third);
public int thirdHighest()
{
    int sum = 0;
    List<int> number = new List<int>();
    int[] array = new int[] { 1, 2, 3, 4, 6, 7 };

    for (int i = 0; i < array.Length; i++)
    {
        for (int j = i + 1; j < array.Length; j++)
        {
            sum = array[i] + array[j];
            if (number.Contains(sum))
            {
            }
            else
            {
                number.Add(sum);
            }
        }
    }

    int[] array1 = new int[number.Count];

    for (int i = 0; i < number.Count; i++)
    {
        array1[i] = number[i];
    }

    Array.Sort<int>(array1);
    Array.Reverse(array1);

    return array1[2];
}

你可以這樣使用它:

int varmax1, varmax2, varmax3, varmax4, varmax5, varmax6, i, j, max=0, max2=0, max3=0;
for(i=0; i<3;i++)
{
    for(j=i;j<3;j++)
    {
        sum=arr[i]+arr[j];
        if(sum>max)
        {
            max3=max2;
            max2=max;
            max=sum;
            varmax1 = varmax3;
            varmax2 = varmax4;
            varmax3 = varmax5;
            varmax4 = varmax6;
            varmax5 = i;
            varmax6 = j;
        }
        else if(sum>max2)
        {
            max3=max2;
            max2=sum;
            varmax1 = varmax3;
            varmax2 = varmax4;
            varmax3=i
            varmax4=j

        }
        else if(sum>max3)
        {
            max3=sum;
            varmax1 = arr[i];
            varmax2 = arr[j];
        }
    }
}
printf("elements with 3rd largest sum are %d %d", varmax1, varmax2);

public static void main(String[] args) { // TODO 自動生成的方法存根

    int[] intList = {5,4,7,8,12,16,19,5};



    Set<Integer> intSumList = new HashSet<Integer>();
    List<Integer> intSumList1 = new ArrayList<Integer>();
    for(int i=0;i<intList.length;i++){

        for(int j=(intList.length - 1);j>i;j--)
            {
            //  System.out.println(intList[j]+" --- "+intList[i]);
                intSumList.add((intList[j]+intList[i]));
            }   
        }

    for(int ele : intSumList){
        intSumList1.add(ele);
    }

    Collections.sort(intSumList1);

    for(int ele : intSumList1){
        System.out.println(ele);
    }


    System.out.println("sum is "+intSumList1.get((intSumList1.size()-3)));
    }

暫無
暫無

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

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