For a given array A of N integers and a sequence S of N integers from the set {−1, 1}, we define val(A, S) as follows:
val(A, S) = |sum{ A[i]*S[i] for i = 0..N−1 }|
(Assume that the sum of zero elements equals zero.)
For a given array A, we are looking for such a sequence S that minimizes val(A,S).
Write a function:
class Solution { public int solution(int[] A); }
that, given an array A of N integers, computes the minimum value of val(A,S) from all possible values of val(A,S) for all possible sequences S of N integers from the set {−1, 1}.
For example, given array:
A[0] = 1 A[1] = 5 A[2] = 2 A[3] = -2your function should return 0, since for S = [−1, 1, −1, 1], val(A, S) = 0, which is the minimum possible value.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [0..20,000];
- each element of array A is an integer within the range [−100..100].
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = A[i];
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
import java.math.*;
import java.lang.Integer;
import java.util.*;
class Solution {
int findmax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
return maxval;
}
int[] removemax(int[] A)
{
int maxval = Integer.MIN_VALUE;
int i,maxi;
maxi = -1;
for(i=0; i< A.length; i++)
{
if( Math.abs(A[i]) > maxval )
{
maxval = Math.abs(A[i]);
maxi = i;
}
}
int[] newArray;
int k;
k=0;
newArray= new int[A.length-1];
for(i=0; i< A.length; i++)
{
if( i != maxi )
newArray[k++] = A[i];
}
return newArray;
}
int min_abs_sum ( int[] A ) {
if( A.length == 0 ) return 0;
int i,j;
int maxval = Integer.MIN_VALUE;
int maxi = 0;
int newval;
maxval= findmax(A);
A = removemax(A);
while( A.length > 0 )
{
newval= findmax(A);
A = removemax(A);
int val1 = Math.abs(maxval-newval);
int val2 = Math.abs(maxval+newval);
if( val1 < val2 )
maxval = val1;
else
maxval = val2;
}
return maxval;
}
}
The following issues have been detected: timeout errors.