找到数组

时间:2015-06-06 07:35:40

标签: c algorithm data-structures

如果我们必须找到数组中一对元素的第三高和。

E.g。给定

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个。

5 个答案:

答案 0 :(得分:0)

首先尝试一种粗暴的方法:

  • 使用双循环扫描数组以查找最大总和sum1;
  • 使用双循环重新扫描数组,以找到与sum2不同的最大总和sum1;
  • 第三次重新扫描数组以找到与sum3sum1不同的最大总和sum2;
  • 最后一次重新扫描数组以打印所有具有总和sum3的对。

时间复杂度是二次的,但它会正确处理重复。

然后,您可以通过过滤数组来大幅降低复杂性,如果存在重复项,则只保留最多3个数字,最多2个实例。这可以在线性时间内完成。然后,您可以在最多6个元素的集合上运行二次算法。总复杂度仍然是线性的。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

答案 3 :(得分:-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);

答案 4 :(得分:-3)

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