// // your code goes here
// function binarySearch(arr, n, target) {
// let left=0, right=n-1, mid;
// while(left<=right) {
// mid = Math.floor((left+right)/2);
// if(arr[mid] < target) {
// left = mid+1;
// } else if(arr[mid] > target) {
// right = mid-1;
// } else {
// return mid;
// }
// }
// return -1;
// }
// console.log(binarySearch([2, 4, 5, 7, 8, 9, 11], 7, 8))
// 120 -> 60 -> 30 -> 15 -> 7 -> 3 -> 1 --> over
// Lower bound: find the index of the first element greater than or equal
// to a target element
// eg. lowerBound([2, 4, 5, 7, 8, 9, 11], 7, 6) = 3
// lowerBound([2, 4, 5, 7, 8, 9, 11], 7, 5) = 2
// lowerBound([2, 4, 5, 7, 8, 9, 11], 7, 13) = -1
function lowerBound(arr, n, target) {
let left=0, right=n-1, mid;
let ans = -1;
while(left<=right) {
mid = Math.floor((left+right)/2);
if(arr[mid] < target) {
left = mid+1;
} else if(arr[mid] >= target) {
ans = mid;
right = mid-1;
}
}
return ans;
}
// console.log(lowerBound([2, 4, 5, 7, 8, 9, 11], 7, 5))
// [2, 4, 5, 7, 8, 9, 11], 7, 5
// left=0, right=6, mid = 3, arr[3] = 7 >= 5, ans = 3, right = mid-1
// left=0, right=2, mid = 1, arr[1] = 4 < 5, left = mid+1 = 2
// left=2, right=2, mid = 2, arr[2] = 5 >=5, ans = 2, right = mid-1 = 1
// left=2, right=1
// Upper bound: find the index of the first element greater than target element
// eg. upperBound([2, 4, 5, 7, 8, 9, 11], 7, 6) = 3
// lowerBound([2, 4, 5, 7, 8, 9, 11], 7, 5) = 3
// lowerBound([2, 4, 5, 7, 8, 9, 11], 7, 13) = -1
function upperBound(arr, n, target) {
let left=0, right=n-1, mid;
let ans = -1;
while(left<=right) {
mid = Math.floor((left+right)/2);
if(arr[mid] <= target) {
left = mid+1;
} else {
ans = mid;
right = mid-1;
}
}
return ans;
}
console.log(upperBound([2, 4, 5, 7, 8, 9, 11], 7, 5))
Ly8gLy8geW91ciBjb2RlIGdvZXMgaGVyZQovLyBmdW5jdGlvbiBiaW5hcnlTZWFyY2goYXJyLCBuLCB0YXJnZXQpIHsKLy8gCWxldCBsZWZ0PTAsIHJpZ2h0PW4tMSwgbWlkOwovLyAJd2hpbGUobGVmdDw9cmlnaHQpIHsKLy8gCQltaWQgPSBNYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTsKLy8gCQlpZihhcnJbbWlkXSA8IHRhcmdldCkgewovLyAJCQlsZWZ0ID0gbWlkKzE7Ci8vIAkJfSBlbHNlIGlmKGFyclttaWRdID4gdGFyZ2V0KSB7Ci8vIAkJCXJpZ2h0ID0gbWlkLTE7Ci8vIAkJfSBlbHNlIHsKLy8gCQkJcmV0dXJuIG1pZDsKLy8gCQl9Ci8vIAl9Ci8vIAlyZXR1cm4gLTE7Ci8vIH0KCi8vIGNvbnNvbGUubG9nKGJpbmFyeVNlYXJjaChbMiwgNCwgNSwgNywgOCwgOSwgMTFdLCA3LCA4KSkKCi8vIDEyMCAtPiA2MCAtPiAzMCAtPiAxNSAtPiA3IC0+IDMgLT4gMSAtLT4gb3ZlcgoKLy8gTG93ZXIgYm91bmQ6IGZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAKLy8gdG8gYSB0YXJnZXQgZWxlbWVudAovLyBlZy4gbG93ZXJCb3VuZChbMiwgNCwgNSwgNywgOCwgOSwgMTFdLCA3LCA2KSA9IDMKLy8gICAgIGxvd2VyQm91bmQoWzIsIDQsIDUsIDcsIDgsIDksIDExXSwgNywgNSkgPSAyCi8vICAgICBsb3dlckJvdW5kKFsyLCA0LCA1LCA3LCA4LCA5LCAxMV0sIDcsIDEzKSA9IC0xCgpmdW5jdGlvbiBsb3dlckJvdW5kKGFyciwgbiwgdGFyZ2V0KSB7CglsZXQgbGVmdD0wLCByaWdodD1uLTEsIG1pZDsKCWxldCBhbnMgPSAtMTsKCXdoaWxlKGxlZnQ8PXJpZ2h0KSB7CgkJbWlkID0gTWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7CgkJaWYoYXJyW21pZF0gPCB0YXJnZXQpIHsKCQkJbGVmdCA9IG1pZCsxOwoJCX0gZWxzZSBpZihhcnJbbWlkXSA+PSB0YXJnZXQpIHsKCQkJYW5zID0gbWlkOwoJCQlyaWdodCA9IG1pZC0xOwoJCX0KCX0KCXJldHVybiBhbnM7Cn0KCi8vIGNvbnNvbGUubG9nKGxvd2VyQm91bmQoWzIsIDQsIDUsIDcsIDgsIDksIDExXSwgNywgNSkpCgovLyBbMiwgNCwgNSwgNywgOCwgOSwgMTFdLCA3LCA1CgovLyBsZWZ0PTAsIHJpZ2h0PTYsIG1pZCA9IDMsIGFyclszXSA9IDcgPj0gNSwgYW5zID0gMywgcmlnaHQgPSBtaWQtMQovLyBsZWZ0PTAsIHJpZ2h0PTIsIG1pZCA9IDEsIGFyclsxXSA9IDQgPCA1LCBsZWZ0ID0gbWlkKzEgPSAyCi8vIGxlZnQ9MiwgcmlnaHQ9MiwgbWlkID0gMiwgYXJyWzJdID0gNSA+PTUsIGFucyA9IDIsIHJpZ2h0ID0gbWlkLTEgPSAxCi8vIGxlZnQ9MiwgcmlnaHQ9MQoKLy8gVXBwZXIgYm91bmQ6IGZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGdyZWF0ZXIgdGhhbiB0YXJnZXQgZWxlbWVudAovLyBlZy4gdXBwZXJCb3VuZChbMiwgNCwgNSwgNywgOCwgOSwgMTFdLCA3LCA2KSA9IDMKLy8gICAgIGxvd2VyQm91bmQoWzIsIDQsIDUsIDcsIDgsIDksIDExXSwgNywgNSkgPSAzCi8vICAgICBsb3dlckJvdW5kKFsyLCA0LCA1LCA3LCA4LCA5LCAxMV0sIDcsIDEzKSA9IC0xCgoKZnVuY3Rpb24gdXBwZXJCb3VuZChhcnIsIG4sIHRhcmdldCkgewoJbGV0IGxlZnQ9MCwgcmlnaHQ9bi0xLCBtaWQ7CglsZXQgYW5zID0gLTE7Cgl3aGlsZShsZWZ0PD1yaWdodCkgewoJCW1pZCA9IE1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpOwoJCWlmKGFyclttaWRdIDw9IHRhcmdldCkgewoJCQlsZWZ0ID0gbWlkKzE7CgkJfSBlbHNlIHsKCQkJYW5zID0gbWlkOwoJCQlyaWdodCA9IG1pZC0xOwoJCX0KCX0KCXJldHVybiBhbnM7Cn0KCmNvbnNvbGUubG9nKHVwcGVyQm91bmQoWzIsIDQsIDUsIDcsIDgsIDksIDExXSwgNywgNSkp