fork download
  1. import java.util.*;
  2.  
  3. class LogNSearch {
  4. public static void main(String[] args) {
  5. int[] arr = {1, 2, 2, 2, 2, 3, 4, 5, 6, 7}; // Sorted array
  6. int target = 2; // Element to find
  7. int index = findMiddleOccurrence(arr, target);
  8.  
  9. System.out.println("Output: " + index);
  10. }
  11.  
  12. public static int findMiddleOccurrence(int[] arr, int target) {
  13. int first = findFirstOccurrence(arr, target);
  14. if (first == -1) {
  15. return -1; // Target not found
  16. }
  17.  
  18. int last = findLastOccurrence(arr, target);
  19.  
  20. // Calculate middle occurrence
  21. return (first + last) / 2;
  22. }
  23.  
  24. private static int findFirstOccurrence(int[] arr, int target) {
  25. int l = 0, r = arr.length - 1;
  26. int first = -1;
  27.  
  28. while (l <= r) {
  29. int m = l + (r - l) / 2; // Avoid overflow
  30. if (arr[m] >= target) {
  31. if (arr[m] == target) {
  32. first = m; // Update first occurrence
  33. }
  34. r = m - 1; // Search left
  35. } else {
  36. l = m + 1; // Search right
  37. }
  38. }
  39. return first;
  40. }
  41.  
  42. private static int findLastOccurrence(int[] arr, int target) {
  43. int l = 0, r = arr.length - 1;
  44. int last = -1;
  45.  
  46. while (l <= r) {
  47. int m = l + (r - l) / 2; // Avoid overflow
  48. if (arr[m] <= target) {
  49. if (arr[m] == target) {
  50. last = m; // Update last occurrence
  51. }
  52. l = m + 1; // Search right
  53. } else {
  54. r = m - 1; // Search left
  55. }
  56. }
  57. return last;
  58. }
  59. }
  60.  
Success #stdin #stdout 0.11s 55320KB
stdin
Standard input is empty
stdout
Output: 2