如果我们必须找到数组中一对元素的第三高和。
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个。
答案 0 :(得分:0)
首先尝试一种粗暴的方法:
sum1
; sum2
不同的最大总和sum1
; sum3
和sum1
不同的最大总和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)));
}