给定一个数组arr [] 。任务是找到X的值,使得表达式(A [1] – X)^ 2 +(A [2] – X)^ 2 +(A [3] – X)^ 2 +…的结果(A [n-1]-X)^ 2 +(A [n]-X)^ 2最小可能。
例子 :
Input : arr[] = {6, 9, 1, 6, 1, 3, 7}
Output : 5
Input : arr[] = {1, 2, 3, 4, 5}
Output : 3
方法:
我们可以简化需要最小化的表达式。表达式可以写成
(A[1]^2 + A[2]^2 + A[3]^2 + … + A[n]^2) + nX^2 – 2X(A[1] + A[2] + A[3] + … + A[n])
通过区分上面的表达式,我们得到
2nX - 2(A[1] + A[2] + A[3] + … + A[n])
我们可以将术语(A [1] + A [2] + A [3] +…+ A [n])表示为S。
2nX - 2S
放2nX – 2S = 0,我们得到
X = S/N
下面是上述方法的实现:
C++
// C++ implementation of above approach
#include
using namespace std;
// Function to calculate value of X
int valueofX(int ar[], int n)
{
int sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + ar[i];
}
if (sum % n == 0) {
return sum / n;
}
else {
int A = sum / n, B = sum / n + 1;
int ValueA = 0, ValueB = 0;
// Check for both possibilities
for (int i = 0; i < n; i++) {
ValueA += (ar[i] - A) * (ar[i] - A);
ValueB += (ar[i] - B) * (ar[i] - B);
}
if (ValueA < ValueB) {
return A;
}
else {
return B;
}
}
}
// Driver Code
int main()
{
int n = 7;
int arr[7] = { 6, 9, 1, 6, 1, 3, 7 };
cout << valueofX(arr, n) << '\n';
return 0;
}
Java
// Java implementation of above approach
class GFG
{
// Function to calculate value of X
static int valueofX(int ar[], int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum = sum + ar[i];
}
if (sum % n == 0)
{
return sum / n;
}
else
{
int A = sum / n, B = sum / n + 1;
int ValueA = 0, ValueB = 0;
// Check for both possibilities
for (int i = 0; i < n; i++)
{
ValueA += (ar[i] - A) * (ar[i] - A);
ValueB += (ar[i] - B) * (ar[i] - B);
}
if (ValueA < ValueB)
{
return A;
}
else
{
return B;
}
}
}
// Driver Code
public static void main(String args[])
{
int n = 7;
int arr[] = { 6, 9, 1, 6, 1, 3, 7 };
System.out.println(valueofX(arr, n));
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 implementation of above approach
# Function to calculate value of X
def valueofX(ar, n):
summ = sum(ar)
if (summ % n == 0):
return summ // n
else:
A = summ // n
B = summ // n + 1
ValueA = 0
ValueB = 0
# Check for both possibilities
for i in range(n):
ValueA += (ar[i] - A) * (ar[i] - A)
ValueB += (ar[i] - B) * (ar[i] - B)
if (ValueA < ValueB):
return A
else:
return B
# Driver Code
n = 7
arr = [6, 9, 1, 6, 1, 3, 7]
print(valueofX(arr, n))
# This code is contributed by Mohit Kumar
C#
// C# implementation of above approach
using System;
class GFG
{
// Function to calculate value of X
static int valueofX(int []ar, int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum = sum + ar[i];
}
if (sum % n == 0)
{
return sum / n;
}
else
{
int A = sum / n, B = sum / n + 1;
int ValueA = 0, ValueB = 0;
// Check for both possibilities
for (int i = 0; i < n; i++)
{
ValueA += (ar[i] - A) * (ar[i] - A);
ValueB += (ar[i] - B) * (ar[i] - B);
}
if (ValueA < ValueB)
{
return A;
}
else
{
return B;
}
}
}
// Driver Code
public static void Main(String []args)
{
int n = 7;
int []arr = { 6, 9, 1, 6, 1, 3, 7 };
Console.WriteLine(valueofX(arr, n));
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
5
时间复杂度: O(n)