# Search equal, bigger or smaller in a sorted array in Java

Given array of sorted integer, search key and search preferences find array position. A search preferences can be:
1) EQUAL – search only for equal key or -1 if not found. It’s a regular binary search.
2) EQUAL_OR_SMALLER – search only for equal key or the closest smaller. -1 if not found.
3) EQUAL_OR_BIGGER – search only for equal key or the closest bigger. -1 if not found.

Examples:

```Input : { 0, 2, 4, 6 }, key -1, EQUAL
Output : -1

Input : { 0, 2, 4, 6 }, key -1, EQUAL_OR_BIGGER
Output : 0

Input : { 0, 2, 4, 6 }, key 7, EQUAL_OR_BIGGER
Output : -1

Input : { 0, 2, 4, 6 }, key 7, EQUAL_OR_SMALLER
Output : 3
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

In regular binary search algorithm evaluation and division perform as far as subarray size is bigger than 0.
In our case if we want to keep single function we need to perform final evaluation in subarray of size=2. Only in subarray size==2 is possible to check both EQUAL_OR_SMALLER and EQUAL_OR_BIGGER conditions.

In below code, SC stands for Search Criteria.

 `public` `class` `BinarySearchEqualOrClose { ` ` `  `    ``private` `static` `void` `printResult(``int` `key, ``int` `pos, ` `                                    ``SC sC) ` `    ``{ ` `        ``System.out.println(``""` `+ key + ``", "` `+ sC + ``":"` `+ pos); ` `    ``} ` ` `  `    ``enum` `SC { ` `        ``EQUAL, ` `        ``EQUAL_OR_BIGGER, ` `        ``EQUAL_OR_SMALLER ` `    ``}; ` ` `  `    ``public` `static` `int` `searchEqualOrClose(``int` `key, ``int``[] arr, SC sC) ` `    ``{ ` `        ``if` `(arr == ``null` `|| arr.length == ``0``) { ` `            ``return` `-``1``; ` `        ``} ` ` `  `        ``if` `(arr.length == ``1``) { ``// just eliminate case of length==1 ` ` `  `            ``// since algorithm needs min array size==2 ` `            ``// to start final evaluations ` `            ``if` `(arr[``0``] == key) { ` `                ``return` `0``; ` `            ``} ` `            ``if` `(arr[``0``] < key && sC == SC.EQUAL_OR_SMALLER) { ` `                ``return` `0``; ` `            ``} ` `            ``if` `(arr[``0``] > key && sC == SC.EQUAL_OR_BIGGER) { ` `                ``return` `0``; ` `            ``} ` `            ``return` `-``1``; ` `        ``} ` `        ``return` `searchEqualOrClose(arr, key, ``0``, arr.length - ``1``, sC); ` `    ``} ` ` `  `    ``private` `static` `int` `searchEqualOrClose(``int``[] arr, ``int` `key, ` `                                          ``int` `start, ``int` `end, SC sC) ` `    ``{ ` `        ``int` `midPos = (start + end) / ``2``; ` `        ``int` `midVal = arr[midPos]; ` `        ``if` `(midVal == key) { ` `            ``return` `midPos; ``// equal is top priority ` `        ``} ` ` `  `        ``if` `(start >= end - ``1``) { ` `            ``if` `(arr[end] == key) { ` `                ``return` `end; ` `            ``} ` `            ``if` `(sC == SC.EQUAL_OR_SMALLER) { ` ` `  `                ``// find biggest of smaller element ` `                ``if` `(arr[start] > key && start != ``0``) { ` ` `  `                    ``// even before if "start" is not a first ` `                    ``return` `start - ``1``; ` `                ``} ` `                ``if` `(arr[end] < key) { ` `                    ``return` `end; ` `                ``} ` `                ``if` `(arr[start] < key) { ` `                    ``return` `start; ` `                ``} ` `                ``return` `-``1``; ` `            ``} ` `            ``if` `(sC == SC.EQUAL_OR_BIGGER) { ` ` `  `                ``// find smallest of bigger element ` `                ``if` `(arr[end] < key && end != arr.length - ``1``) { ` ` `  `                    ``// even after if "end" is not a last ` `                    ``return` `end + ``1``; ` `                ``} ` `                ``if` `(arr[start] > key) { ` `                    ``return` `start; ` `                ``} ` `                ``if` `(arr[end] > key) { ` `                    ``return` `end; ` `                ``} ` `                ``return` `-``1``; ` `            ``} ` `            ``return` `-``1``; ` `        ``} ` `        ``if` `(midVal > key) { ` `            ``return` `searchEqualOrClose(arr, key, start, midPos - ``1``, sC); ` `        ``} ` `        ``return` `searchEqualOrClose(arr, key, midPos + ``1``, end, sC); ` `    ``} ` ` `  `    ``public` `static` `void` `main(String[] args) ` `    ``{ ` `        ``int``[] arr = ``new` `int``[] { ``0``, ``2``, ``4``, ``6` `}; ` ` `  `        ``// test full range of xs and SearchCriteria ` `        ``for` `(``int` `x = -``1``; x <= ``7``; x++) { ` `            ``int` `pos = searchEqualOrClose(x, arr, SC.EQUAL); ` `            ``printResult(x, pos, SC.EQUAL); ` `            ``pos = searchEqualOrClose(x, arr, SC.EQUAL_OR_SMALLER); ` `            ``printResult(x, pos, SC.EQUAL_OR_SMALLER); ` `            ``pos = searchEqualOrClose(x, arr, SC.EQUAL_OR_BIGGER); ` `            ``printResult(x, pos, SC.EQUAL_OR_BIGGER); ` `        ``} ` `    ``} ` `} `

Output:
```-1, EQUAL:-1
-1, EQUAL_OR_SMALLER:-1
-1, EQUAL_OR_BIGGER:0
0, EQUAL:0
0, EQUAL_OR_SMALLER:0
0, EQUAL_OR_BIGGER:0
1, EQUAL:-1
1, EQUAL_OR_SMALLER:0
1, EQUAL_OR_BIGGER:1
2, EQUAL:1
2, EQUAL_OR_SMALLER:1
2, EQUAL_OR_BIGGER:1
3, EQUAL:-1
3, EQUAL_OR_SMALLER:1
3, EQUAL_OR_BIGGER:2
4, EQUAL:2
4, EQUAL_OR_SMALLER:2
4, EQUAL_OR_BIGGER:2
5, EQUAL:-1
5, EQUAL_OR_SMALLER:2
5, EQUAL_OR_BIGGER:3
6, EQUAL:3
6, EQUAL_OR_SMALLER:3
6, EQUAL_OR_BIGGER:3
7, EQUAL:-1
7, EQUAL_OR_SMALLER:3
7, EQUAL_OR_BIGGER:-1
```

Time Complexity: O(log n)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.