package com.interview.algorithms.array;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 10/21/14
* Time: 12:58 PM
*/
public class C4_70_PartialSortedArrayOffsetFinder2 {
static class Indices {
int begin;
int end;
int getLength(){
return end - begin + 1;
}
}
public static Indices find(int[] array){
Indices asc = find(array, true);
Indices dec = find(array, false);
return asc.getLength() < dec.getLength()? asc : dec;
}
private static Indices find(int[] array, boolean isAsc){
Indices offset = new Indices();
findMiddle(array, offset, isAsc);
shink(array, offset, isAsc);
return offset;
}
private static void findMiddle(int[] array, Indices offset, boolean isAsc){
offset.begin = 0;
offset.end = array.length - 1;
if(isAsc){
while(offset.begin < offset.end && array[offset.begin] <= array[offset.begin + 1]) offset.begin++;
} else {
while(offset.begin < offset.end && array[offset.begin] >= array[offset.begin + 1]) offset.begin++;
}
offset.begin++;
if(isAsc){
while(offset.begin < offset.end && array[offset.end] >= array[offset.end - 1]) offset.end--;
} else {
while(offset.begin < offset.end && array[offset.end] <= array[offset.end - 1]) offset.end--;
}
offset.end--;
}
private static void shink(int[] array, Indices offset, boolean isAsc){
int min = array[offset.begin - 1];
int max = array[offset.begin - 1];
for(int i = offset.begin + 1; i <= offset.end + 1; i++){
if(array[i] < min) min = array[i];
else if(array[i] > max) max = array[i];
}
if(isAsc){
while(offset.begin > 0 && array[offset.begin - 1] > min) offset.begin--;
while(offset.end < array.length - 1 && array[offset.end + 1] < max) offset.end++;
} else {
while(offset.begin > 0 && array[offset.begin - 1] < max) offset.begin--;
while(offset.end < array.length - 1 && array[offset.end + 1] > min) offset.end++;
}
}
}