给定数组中所有对的绝对差之和

给定一个不同元素的排序数组,任务是求给定数组中所有对的绝对差之和。 例如:

null
Input : arr[] = {1, 2, 3, 4}Output: 10Sum of |2-1| + |3-1| + |4-1| +       |3-2| + |4-2| + |4-3| = 10Input : arr[] = {1, 8, 9, 15, 16}Output: 74Input : arr[] = {1, 2, 3, 4, 5, 7, 9, 11, 14}Output: 188

A. 简单解决方案 因为这个问题是一个接一个地寻找每一对,把他们的差异总结在一起。这种方法的时间复杂度为O(n) 2. ). 一 有效解决方案 对于这个问题需要一个简单的观察。由于数组是排序的,当我们取对的绝对差之和时,元素是不同的,所以第i个位置的每个元素加上“i”次,减去“n-1-i”次。 例如,在{1,2,3,4}元素中,索引2是arr[2]=3,所以所有以3为一个元素的对将是(1,3),(2,3)和(3,4),现在当我们求对的绝对差之和时,对于所有以3为一个元素的对,求和将是=(3-1)+(3-2)+(4-3)。我们可以看到,3加i=2次,减去n-1-i=(4-1-2)=1次。 每个元素的广义表达式为sum=sum+(i*a[i])–(n-1-i)*a[i]。

C++

// C++ program to find sum of absolutre differences
// in all pairs in a sorted array of distinct numbers
#include<bits/stdc++.h>
using namespace std;
// Function to calculate sum of absolute difference
// of all pairs in array
// arr[]  --> array of elements
int sumPairs( int arr[], int n)
{
// final result
int sum = 0;
for ( int i=n-1; i>=0; i--)
sum += i*arr[i] - (n-1-i)*arr[i];
return sum;
}
// Driver program to run the case
int main()
{
int arr[] = {1, 8, 9, 15, 16};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << sumPairs(arr, n);
return 0;
}


JAVA

// Java program to find sum of absolutre
// differences in all pairs in a sorted
// array of distinct numbers
class GFG {
// Function to calculate sum of absolute
// difference of all pairs in array
// arr[] --> array of elements
static int sumPairs( int arr[], int n)
{
// final result
int sum = 0 ;
for ( int i = n - 1 ; i >= 0 ; i--)
sum += i * arr[i] - (n - 1 - i)
* arr[i];
return sum;
}
// Driver program
public static void main(String arg[])
{
int arr[] = { 1 , 8 , 9 , 15 , 16 };
int n = arr.length;
System.out.print(sumPairs(arr, n));
}
}
// This code is contributed by Anant Agarwal.


Python3

# Python3 program to find sum of
# absolutre differences in all pairs
# in a sorted array of distinct numbers
# Function to calculate sum of absolute
# difference of all pairs in array
# arr[] --> array of elements
def sumPairs(arr, n):
# final result
sum = 0
for i in range (n - 1 , - 1 , - 1 ):
sum + = i * arr[i] - (n - 1 - i) * arr[i]
return sum
# Driver program
arr = [ 1 , 8 , 9 , 15 , 16 ]
n = len (arr)
print (sumPairs(arr, n))
# This code is contributed by Anant Agarwal.


C#

// C# program to find sum of absolutre
// differences in all pairs in a sorted
// array of distinct numbers
using System;
class GFG {
// Function to calculate sum of absolute
// difference of all pairs in array
// arr[] --> array of elements
static int sumPairs( int []arr, int n)
{
// final result
int sum = 0;
for ( int i = n - 1; i >= 0; i--)
sum += i * arr[i] - (n - 1 - i)
* arr[i];
return sum;
}
// Driver program
public static void Main()
{
int []arr = { 1, 8, 9, 15, 16 };
int n = arr.Length;
Console.Write(sumPairs(arr, n));
}
}
// This code is contributed by nitin mittal.


PHP

<?php
// PHP program to find sum of absolutre differences
// in all pairs in a sorted array of distinct numbers
// Function to calculate sum of absolute difference
// of all pairs in array
// arr[] --> array of elements
function sumPairs( $arr , $n )
{
// final result
$sum = 0;
for ( $i = $n -1; $i >=0; $i --)
$sum = $sum + $i * $arr [ $i ] - ( $n -1- $i )* $arr [ $i ];
return $sum ;
}
// Driver program to run the case
$arr = array (1, 8, 9, 15, 16);
$n = sizeof( $arr )/sizeof( $arr [0]);
echo sumPairs( $arr , $n );
?>


Javascript

<script>
// JavaScript program to find
// sum of absolutre differences
// in all pairs in a sorted array
// of distinct numbers
// Function to calculate sum of absolute difference
// of all pairs in array
// arr[]  --> array of elements
function sumPairs( arr, n)
{
// final result
let sum = 0;
for (let i=n-1; i>=0; i--)
sum += i*arr[i] - (n-1-i)*arr[i];
return sum;
}
// Driver program to run the case
let arr = [ 1, 8, 9, 15, 16 ];
let n = arr.length;
document.write(sumPairs(arr, n));
</script>


输出:

74

时间复杂度:O(n) 辅助空间:O(1)e 如果数组没有排序呢? 对于数组未排序的情况,有效的解决方案也更好。我们可以先在O(n logn)时间内对数组进行排序,然后在O(n)时间内找到所需的值。所以总的时间复杂度是O(n logn),这仍然比O(n)好 2. ) 本文由 沙申克·米什拉(古卢) .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享