import java.util.*;
class MainClass {
public static void main
(String[] args
) { int[] a = {0, 0, 0};
System.
out.
println(((Object) isThreeSumEqualsTarget
(a,
0)).
toString()); }
public static boolean isThreeSumEqualsTarget(int[] array, int targetNumber) {
//O(n log (n))
int leftIndex = 0;
int rightIndex = array.length - 1;
//O(n)
while (leftIndex + 1 < rightIndex - 1) {
//take sum of two corners
int sum = array[leftIndex] + array[rightIndex];
//find if the number matches exactly. Or get the closest match.
//here i am not storing closest matches. You can do it for yourself.
//O(log (n)) complexity
int binarySearchClosestIndex = binarySearch(leftIndex + 1, rightIndex - 1, targetNumber - sum, array);
//if exact match is found, we already got the answer
if (-1 == binarySearchClosestIndex) {
System.
out.
println(("combo is " + array
[leftIndex
] + ", " + array
[rightIndex
] + ", " + (targetNumber
- sum
))); return true;
}
//if exact match is not found, we have to decide which pointer, left or right to move inwards
//we are here means , either we are on left end or on right end
else {
//we ended up searching towards start of array,i.e. we need a lesser sum , lets move inwards from right
//we need to have a lower sum, lets decrease right index
if (binarySearchClosestIndex == leftIndex + 1) {
rightIndex--;
} else if (binarySearchClosestIndex == rightIndex - 1) {
//we need to have a higher sum, lets decrease right index
leftIndex++;
}
}
}
return false;
}
public static int binarySearch(int start, int end, int elem, int[] array) {
int mid = 0;
while (start <= end) {
mid = (start + end) >>> 1;
if (elem < array[mid]) {
end = mid - 1;
} else if (elem > array[mid]) {
start = mid + 1;
} else {
//exact match case
//Suits more for this particular case to return -1
return -1;
}
}
return mid;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwpjbGFzcyBNYWluQ2xhc3MgewogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBpbnRbXSBhID0gezAsIDAsIDB9OwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigoKE9iamVjdCkgaXNUaHJlZVN1bUVxdWFsc1RhcmdldChhLCAwKSkudG9TdHJpbmcoKSk7Cn0KCnB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RocmVlU3VtRXF1YWxzVGFyZ2V0KGludFtdIGFycmF5LCBpbnQgdGFyZ2V0TnVtYmVyKSB7CgogICAgLy9PKG4gbG9nIChuKSkKICAgIEFycmF5cy5zb3J0KGFycmF5KTsKICAgIFN5c3RlbS5vdXQucHJpbnRsbihBcnJheXMudG9TdHJpbmcoYXJyYXkpKTsKCiAgICBpbnQgbGVmdEluZGV4ID0gMDsKICAgIGludCByaWdodEluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMTsKCiAgICAvL08obikKICAgIHdoaWxlIChsZWZ0SW5kZXggKyAxIDwgcmlnaHRJbmRleCAtIDEpIHsKICAgICAgICAvL3Rha2Ugc3VtIG9mIHR3byBjb3JuZXJzCiAgICAgICAgaW50IHN1bSA9IGFycmF5W2xlZnRJbmRleF0gKyBhcnJheVtyaWdodEluZGV4XTsKICAgICAgICAvL2ZpbmQgaWYgdGhlIG51bWJlciBtYXRjaGVzIGV4YWN0bHkuIE9yIGdldCB0aGUgY2xvc2VzdCBtYXRjaC4KICAgICAgICAvL2hlcmUgaSBhbSBub3Qgc3RvcmluZyBjbG9zZXN0IG1hdGNoZXMuIFlvdSBjYW4gZG8gaXQgZm9yIHlvdXJzZWxmLgogICAgICAgIC8vTyhsb2cgKG4pKSBjb21wbGV4aXR5CiAgICAgICAgaW50IGJpbmFyeVNlYXJjaENsb3Nlc3RJbmRleCA9IGJpbmFyeVNlYXJjaChsZWZ0SW5kZXggKyAxLCByaWdodEluZGV4IC0gMSwgdGFyZ2V0TnVtYmVyIC0gc3VtLCBhcnJheSk7CiAgICAgICAgLy9pZiBleGFjdCBtYXRjaCBpcyBmb3VuZCwgd2UgYWxyZWFkeSBnb3QgdGhlIGFuc3dlcgogICAgICAgIGlmICgtMSA9PSBiaW5hcnlTZWFyY2hDbG9zZXN0SW5kZXgpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCgiY29tYm8gaXMgIiArIGFycmF5W2xlZnRJbmRleF0gKyAiLCAiICsgYXJyYXlbcmlnaHRJbmRleF0gKyAiLCAiICsgKHRhcmdldE51bWJlciAtIHN1bSkpKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8vaWYgZXhhY3QgbWF0Y2ggaXMgbm90IGZvdW5kLCB3ZSBoYXZlIHRvIGRlY2lkZSB3aGljaCBwb2ludGVyLCBsZWZ0IG9yIHJpZ2h0IHRvIG1vdmUgaW53YXJkcwogICAgICAgIC8vd2UgYXJlIGhlcmUgbWVhbnMgLCBlaXRoZXIgd2UgYXJlIG9uIGxlZnQgZW5kIG9yIG9uIHJpZ2h0IGVuZAogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy93ZSBlbmRlZCB1cCBzZWFyY2hpbmcgdG93YXJkcyBzdGFydCBvZiBhcnJheSxpLmUuIHdlIG5lZWQgYSBsZXNzZXIgc3VtICwgbGV0cyBtb3ZlIGlud2FyZHMgZnJvbSByaWdodAogICAgICAgICAgICAvL3dlIG5lZWQgdG8gaGF2ZSBhIGxvd2VyIHN1bSwgbGV0cyBkZWNyZWFzZSByaWdodCBpbmRleAogICAgICAgICAgICBpZiAoYmluYXJ5U2VhcmNoQ2xvc2VzdEluZGV4ID09IGxlZnRJbmRleCArIDEpIHsKICAgICAgICAgICAgICAgIHJpZ2h0SW5kZXgtLTsKICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5hcnlTZWFyY2hDbG9zZXN0SW5kZXggPT0gcmlnaHRJbmRleCAtIDEpIHsKICAgICAgICAgICAgICAgIC8vd2UgbmVlZCB0byBoYXZlIGEgaGlnaGVyIHN1bSwgbGV0cyBkZWNyZWFzZSByaWdodCBpbmRleAogICAgICAgICAgICAgICAgbGVmdEluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgaW50IGJpbmFyeVNlYXJjaChpbnQgc3RhcnQsIGludCBlbmQsIGludCBlbGVtLCBpbnRbXSBhcnJheSkgewogICAgaW50IG1pZCA9IDA7CiAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CiAgICAgICAgbWlkID0gKHN0YXJ0ICsgZW5kKSA+Pj4gMTsKICAgICAgICBpZiAoZWxlbSA8IGFycmF5W21pZF0pIHsKICAgICAgICAgICAgZW5kID0gbWlkIC0gMTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW0gPiBhcnJheVttaWRdKSB7CiAgICAgICAgICAgIHN0YXJ0ID0gbWlkICsgMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL2V4YWN0IG1hdGNoIGNhc2UKICAgICAgICAgICAgLy9TdWl0cyBtb3JlIGZvciB0aGlzIHBhcnRpY3VsYXIgY2FzZSB0byByZXR1cm4gLTEKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtaWQ7Cn0KfQ==