class Go {
public static void main
(String args
[]){ int[][] dataSets = { { 42 },
{ 42, 64 },
{ 64, 42 },
{ 1, 2, 3 },
{ 2, 3, 1 },
{ 3, 2, 1 },
{ 4, 5, 6, 7, 1, 2, 3 },
{ 4, 5, 6, 7, 8, 9, 1, 2, 3 },
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 },
{ 9, 1, 2, 3, 4, 5, 6, 7, 8 }
};
System.
out.
println("Max Values:"); for(int i=0; i< dataSets.length; ++i)
System.
out.
println(findLargestValueInSemiSortedArray
(dataSets
[i
]));
boolean failed = false;
try { findLargestValueInSemiSortedArray(null); failed = true; }
try { findLargestValueInSemiSortedArray(new int[0]); failed = true; }
if(!failed)
System.
out.
println("Correctly Rejected Illegal Values"); }
public static int findLargestValueInSemiSortedArray(int arr[]) {
if(arr==null || arr.length==0)
int hi = arr.length; /* exclusive upper bound */
int low = 0; /* inclusive lower bound */
int mid = low/2 + hi/2;
while(low < hi) {
if(isPivotIndex(arr,mid))
return arr[mid];
if(arr[hi-1] < arr[mid])
low = mid + 1;
else
hi = mid;
mid = low/2 + hi/2;
}
/* Array was actually sorted, either ascending or descending */
/* Note that return this covers corner cases of arr.length <= 3 */
return max(arr[0], arr[arr.length-1]);
}
public static int max(final int a, final int b) {
return (a > b) ? a : b;
}
public static boolean isPivotIndex(final int[] arr, final int index) {
int b = arr[index];
int a
= (index
> 0) ? arr
[index
-1] : Integer.
MAX_VALUE; int c
= (index
< arr.
length-1) ? arr
[index
+1] : Integer.
MAX_VALUE; return a <= b && b > c;
}
}
Y2xhc3MgR28gewogICAgCnB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10peyAKICBpbnRbXVtdIGRhdGFTZXRzID0geyB7IDQyIH0sCiAgICAgICAgICAgICAgICAgICAgICAgeyA0MiwgNjQgfSwKICAgICAgICAgICAgICAgICAgICAgICB7IDY0LCA0MiB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgMSwgMiwgMyB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgMiwgMywgMSB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgMywgMiwgMSB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgNCwgNSwgNiwgNywgMSwgMiwgMyB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgNCwgNSwgNiwgNywgOCwgOSwgMSwgMiwgMyB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9LAogICAgICAgICAgICAgICAgICAgICAgIHsgOSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCB9CiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgIAogIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4IFZhbHVlczoiKTsKICBmb3IoaW50IGk9MDsgaTwgZGF0YVNldHMubGVuZ3RoOyArK2kpCiAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmluZExhcmdlc3RWYWx1ZUluU2VtaVNvcnRlZEFycmF5KGRhdGFTZXRzW2ldKSk7CgogIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CiAgdHJ5IHsgZmluZExhcmdlc3RWYWx1ZUluU2VtaVNvcnRlZEFycmF5KG51bGwpOyAgICAgICBmYWlsZWQgPSB0cnVlOyB9CiAgY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgOyB9CiAgdHJ5IHsgZmluZExhcmdlc3RWYWx1ZUluU2VtaVNvcnRlZEFycmF5KG5ldyBpbnRbMF0pOyBmYWlsZWQgPSB0cnVlOyB9CiAgY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsgOyB9CiAgaWYoIWZhaWxlZCkKICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29ycmVjdGx5IFJlamVjdGVkIElsbGVnYWwgVmFsdWVzIik7Cn0KIApwdWJsaWMgc3RhdGljIGludCBmaW5kTGFyZ2VzdFZhbHVlSW5TZW1pU29ydGVkQXJyYXkoaW50IGFycltdKSB7CiAgaWYoYXJyPT1udWxsIHx8IGFyci5sZW5ndGg9PTApCiAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CgogIGludCBoaSAgPSBhcnIubGVuZ3RoOyAvKiBleGNsdXNpdmUgdXBwZXIgYm91bmQgKi8KICBpbnQgbG93ID0gMDsgICAgICAgICAgLyogaW5jbHVzaXZlIGxvd2VyIGJvdW5kICovCiAgaW50IG1pZCA9IGxvdy8yICsgaGkvMjsKICB3aGlsZShsb3cgPCBoaSkgewogICAgaWYoaXNQaXZvdEluZGV4KGFycixtaWQpKQogICAgICByZXR1cm4gYXJyW21pZF07CiAgICBpZihhcnJbaGktMV0gPCBhcnJbbWlkXSkKICAgICAgbG93ID0gbWlkICsgMTsKICAgIGVsc2UKICAgICAgaGkgID0gbWlkOwogICAgbWlkID0gbG93LzIgKyBoaS8yOwogIH0KICAvKiBBcnJheSB3YXMgYWN0dWFsbHkgc29ydGVkLCBlaXRoZXIgYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgICAgKi8KICAvKiBOb3RlIHRoYXQgcmV0dXJuIHRoaXMgY292ZXJzIGNvcm5lciBjYXNlcyBvZiBhcnIubGVuZ3RoIDw9IDMgKi8KICByZXR1cm4gbWF4KGFyclswXSwgYXJyW2Fyci5sZW5ndGgtMV0pOyAKfQoKcHVibGljIHN0YXRpYyBpbnQgbWF4KGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgewogIHJldHVybiAoYSA+IGIpID8gYSA6IGI7Cn0KCnB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Bpdm90SW5kZXgoZmluYWwgaW50W10gYXJyLCBmaW5hbCBpbnQgaW5kZXgpIHsKICBpbnQgYiA9IGFycltpbmRleF07CiAgaW50IGEgPSAoaW5kZXggPiAwKSA/ICAgICAgICAgICAgYXJyW2luZGV4LTFdIDogSW50ZWdlci5NQVhfVkFMVUU7CiAgaW50IGMgPSAoaW5kZXggPCBhcnIubGVuZ3RoLTEpID8gYXJyW2luZGV4KzFdIDogSW50ZWdlci5NQVhfVkFMVUU7CiAgcmV0dXJuIGEgPD0gYiAmJiBiID4gYzsKfQoKfQ==