class Test {
public static void main
( String [ ] args
) { int [ ] sortedArray = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
PrintIntSumValues( 6 , sortedArray) ;
sortedArray = new int [ ] { 1 , 2 ,3 , 12 , 23423 } ;
PrintIntSumValues( 15 , sortedArray) ;
sortedArray = new int [ ] { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } ;
PrintIntSumValues( 100 , sortedArray) ;
sortedArray = new int [ ] { 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20 ,21 ,22 ,23 ,24 ,25 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ,41 ,42 ,43 ,44 ,45 ,46 ,47 ,48 ,49 ,50 } ;
PrintIntSumValues( 48 , sortedArray) ;
}
// Print at the system out the first two ints found in the sorted array: sortedInts[] whose sum is equal to Sum in a single pass over the array sortedInts[] with no 0 value allowed.
// i.e. sortedInts[i] + sortedInts[?] = Sum where ? is the target index to be found to complete the task.
static void PrintIntSumValues( int Sum, int sortedInts[ ] ) {
// need to test to see if the Sum value is contained in the array sortedInts. And, if not do nothing.
int offset = sortedInts.length - 1 ;
for ( int i= 0 ; i< sortedInts.length ; i++ ) {
// ... do some work: algebra and logic ...
if ( ( sortedInts[ i] + sortedInts[ offset] ) == Sum) {
System .
out .
println ( "sortedInts[" + i
+ "]+sortedInts[" + offset
+ "] sums to " + Sum
+ "." ) ; return ;
} else {
int remaining = Sum - sortedInts[ i] ;
if ( remaining < sortedInts[ i] ) {
// We need something before i
if ( remaining < sortedInts[ offset] ) {
// Even before offset
offset = 0 + ( offset - 0 ) / 2 ;
} else {
// Between offset and i
offset = offset + ( i - offset) / 2 ;
}
} else {
// We need something after i
if ( remaining < sortedInts[ offset] ) {
// But before offset
offset = i + ( offset - i) / 2 ;
} else {
// Even after offset
offset = offset + ( sortedInts.length - offset) / 2 ;
}
}
}
}
System .
out .
println ( "There was no sum :(" ) ;
}
}
CWNsYXNzIFRlc3QgewoKCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7ICAKCQkJaW50W10gc29ydGVkQXJyYXkgPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OwoJCQlQcmludEludFN1bVZhbHVlcyg2LCBzb3J0ZWRBcnJheSk7CgkJCQoJCQlzb3J0ZWRBcnJheSA9IG5ldyBpbnRbXSB7MSwgMiwzLCAxMiwgMjM0MjN9OwoJCQlQcmludEludFN1bVZhbHVlcygxNSwgc29ydGVkQXJyYXkpOwoJCQkKCQkJCgkJCXNvcnRlZEFycmF5ID0gbmV3IGludFtdIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CgkJCVByaW50SW50U3VtVmFsdWVzKDEwMCwgc29ydGVkQXJyYXkpOwoJCQkKCQkJc29ydGVkQXJyYXkgPSBuZXcgaW50W10gezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwfTsKCQkJUHJpbnRJbnRTdW1WYWx1ZXMoNDgsIHNvcnRlZEFycmF5KTsgIAoJCX0KCgkJLy8gICAgUHJpbnQgYXQgdGhlIHN5c3RlbSBvdXQgdGhlIGZpcnN0IHR3byBpbnRzIGZvdW5kIGluIHRoZSBzb3J0ZWQgYXJyYXk6IHNvcnRlZEludHNbXSB3aG9zZSBzdW0gaXMgZXF1YWwgdG8gU3VtIGluIGEgc2luZ2xlIHBhc3Mgb3ZlciB0aGUgYXJyYXkgc29ydGVkSW50c1tdIHdpdGggbm8gMCB2YWx1ZSBhbGxvd2VkLiAgCgkJLy8gIGkuZS4gc29ydGVkSW50c1tpXSArIHNvcnRlZEludHNbP10gPSBTdW0gd2hlcmUgPyBpcyB0aGUgdGFyZ2V0IGluZGV4IHRvIGJlIGZvdW5kIHRvIGNvbXBsZXRlIHRoZSB0YXNrLiAgCgkJc3RhdGljIHZvaWQgUHJpbnRJbnRTdW1WYWx1ZXMoaW50IFN1bSwgaW50IHNvcnRlZEludHNbXSkgeyAgCgkJCS8vIG5lZWQgdG8gdGVzdCB0byBzZWUgaWYgdGhlIFN1bSB2YWx1ZSBpcyBjb250YWluZWQgaW4gdGhlIGFycmF5IHNvcnRlZEludHMuIEFuZCwgaWYgbm90IGRvIG5vdGhpbmcuICAKCQkJaW50IG9mZnNldCA9IHNvcnRlZEludHMubGVuZ3RoLTE7CgoJCQlmb3IoaW50IGk9MDsgaTxzb3J0ZWRJbnRzLmxlbmd0aDsgaSsrKSB7ICAKCQkJCS8vICAgICAgICAgICAgLi4uIGRvIHNvbWUgd29yazogYWxnZWJyYSBhbmQgbG9naWMgLi4uICAJCgkJCQlpZiAoKHNvcnRlZEludHNbaV0gKyBzb3J0ZWRJbnRzW29mZnNldF0pID09IFN1bSl7CgkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzb3J0ZWRJbnRzWyIgKyBpICsgIl0rc29ydGVkSW50c1siICsgb2Zmc2V0ICsgIl0gc3VtcyB0byAiICsgU3VtICsgIi4iKTsKCQkJCQlyZXR1cm47CgkJCQl9IGVsc2UgewoJCQkJCWludCByZW1haW5pbmcgPSBTdW0gLSBzb3J0ZWRJbnRzW2ldOwoJCQkJCWlmIChyZW1haW5pbmcgPCBzb3J0ZWRJbnRzW2ldICl7CgkJCQkJCS8vIFdlIG5lZWQgc29tZXRoaW5nIGJlZm9yZSBpCgkJCQkJCWlmIChyZW1haW5pbmcgPCBzb3J0ZWRJbnRzW29mZnNldF0pIHsKCQkJCQkJCS8vIEV2ZW4gYmVmb3JlIG9mZnNldAoJCQkJCQkJb2Zmc2V0ID0gMCArIChvZmZzZXQgLSAwKS8yOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gQmV0d2VlbiBvZmZzZXQgYW5kIGkKCQkJCQkJCW9mZnNldCA9IG9mZnNldCArIChpIC0gb2Zmc2V0KS8yOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gV2UgbmVlZCBzb21ldGhpbmcgYWZ0ZXIgaQoJCQkJCQlpZiAocmVtYWluaW5nIDwgc29ydGVkSW50c1tvZmZzZXRdKSB7CgkJCQkJCQkvLyBCdXQgYmVmb3JlIG9mZnNldAoJCQkJCQkJb2Zmc2V0ID0gaSArIChvZmZzZXQgLSBpKS8yOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gRXZlbiBhZnRlciBvZmZzZXQKCQkJCQkJCW9mZnNldCA9IG9mZnNldCArIChzb3J0ZWRJbnRzLmxlbmd0aCAtIG9mZnNldCkvMjsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSAgCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgd2FzIG5vIHN1bSA6KCIpOwoKCQl9ICAKCX0=