Skip to content

Instantly share code, notes, and snippets.

@arielm
Last active April 29, 2020 13:39
Show Gist options
  • Save arielm/b2b38a01185a816cf27fba2ae6467129 to your computer and use it in GitHub Desktop.
Save arielm/b2b38a01185a816cf27fba2ae6467129 to your computer and use it in GitHub Desktop.
Solution (100%) to MinAvgTwoSlice problem on Codility (https://codility.com/programmers/task/min_avg_two_slice)
/*
* ABSOLUTELY NON-TRIVIAL (AND CERTAINLY NOT DOABLE WITHIN A SHORT TIME FRAME):
* IT'S NECESSARY TO FIND OUT FIRST THAT ONLY SLICES OF LENGTH 2 OR 3 MATTER
*
* PROOF:
* https://codesays.com/2014/solution-to-min-avg-two-slice-by-codility
*
* NOTE: THE USAGE OF "PREFIX-SUMS" IS NOT PURELY NECESSARY
* (BUT IT WAS IN PLACE AT THE TIME I STILL BELIEVED THAT SLICES
* OF ARBITRARY LENGTHS COULD BE INVOLVED...)
*/
class Solution
{
public int solution(int[] A)
{
int N = A.length;
int[] sums = new int[N + 1];
for (int i = 0; i < N; i++)
{
sums[i + 1] = sums[i] + A[i];
}
float minAvg = Float.MAX_VALUE;
int minSliceIndex = 0;
for (int i = 0; i < N - 1; i++)
{
int i0 = i;
int i1 = i + 1;
float avg2 = (sums[i1 + 1] - sums[i0]) / 2.0f;
if (avg2 < minAvg)
{
minAvg = avg2;
minSliceIndex = i;
}
if (i < N - 2)
{
int i2 = i + 2;
float avg3 = (sums[i2 + 1] - sums[i0]) / 3.0f;
if (avg3 < minAvg)
{
minAvg = avg3;
minSliceIndex = i;
}
}
}
return minSliceIndex;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment